it-swarm.com.de

Konfigurieren Sie sendmail in einem Docker-Container

Ich habe einen Docker-Container , auf dem PHP und Apache laufen. Der Host befindet sich in einer AWS-Instanz, in der die Docker-Instanz ausgeführt wird. Ich kann keine E-Mail vom Docker-Terminal senden. Gibt es eine Möglichkeit, eine E-Mail von der Docker-Instanz mit sendmail zu senden, die die Host-Konfiguration des Dockers verwendet?

Der folgende Befehl sendet eine E-Mail vom Host, jedoch keine E-Mail von der Docker-Instanz. Es wird auch kein Fehler angegeben.

echo "Subject: Testing Email" | cat - text | /usr/lib/sendmail -F [email protected] -t [email protected]
17
tarun mittal

Ich muss den Host-MTA so konfigurieren, dass er docker0 abhört und ssmtp im Container installiert, um sendmail im Container mit dem Host-MTA zu überbrücken. Der Grund für das Ausführen eines MTA auf dem Host besteht darin, dass Systemfehler (kritisch) an das Postfach des Administrators gesendet werden können. Der Grund, warum MTA nicht im Container ausgeführt wird, ist, dass es sich um einen duplizierten Prozess handelt, da das Host-System bereits einen MTA ausführt.

Auf dem Host habe ich Postfix verwendet. Alles, was wir tun müssen, ist Postfix zu konfigurieren, um docker0 abzuhören und ausgehende Mails von Docker-Containern zu akzeptieren. Bearbeiten Sie die Datei /etc/postfix/main.cf und fügen Sie die docker0-IP-Adresse zu inet_interfaces hinzu, damit Verbindungen von Docker-Containern akzeptiert werden. Fügen Sie außerdem die Netzwerkadressen von Docker-Containern zu mynetworks hinzu, damit Docker-Container zum Senden von E-Mails über den Postfix-Server auf dem Host berechtigt sind. ( Referenz und weitere Details )

Um sendmail in Containern zu verwenden, installieren Sie ssmtp und setzen Sie FromLineOverride als zulässig und und mailhub auf die IP-Adresse des Hosts in /etc/ssmtp/ssmtp.conf. Sie können mailhub als Symbol wie smtp-server festlegen und anschließend den Container mit der Option --add-Host ausführen, wie in dieser Dockerfile (mit --add-Host smtp-server:your-docker0-address ausgeführt) gezeigt. Dies würde eine verwendbare Sendmail in Containern konfigurieren, die den Host-MTA tatsächlich zum Senden von E-Mails verwenden würde.

19
xuhdev

Nirgendwo in Ihrem Dockerfile ist sendmail (oder ein anderer Mailagent) installiert. Der Host hat jedoch offensichtlich sendmail zur Verfügung. Die "beste" oder meist Docker-ähnliche Lösung besteht darin, einen anderen Container hochzuladen, der einen MTA ausführt (z. B. postfix oder exim ), und die Anwendung so zu konfigurieren, dass sie verwendet wird.

5
naneau

auf früheren Antworten aufbauen,
Erzeuge config/sendmail_config.sh mit:

#!/bin/sh
# set Host in hosts
line=$(head -n 1 /etc/hosts)
line2=$(echo $line | awk '{print $2}')
echo "$line $line2.localdomain" >> /etc/hosts

yum install -y sendmail sendmail-cf m4 \
    && hostname >> /etc/mail/relay-domains \
    && m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

#remove localhost limit
sed -i -e "s/Port=smtp,Addr=127.0.0.1, Name=MTA/Port=smtp, Name=MTA/g" \
    /etc/mail/sendmail.mc
sendmail -bd

yum für apt-get auf Debian-basierten Containern ändern

dann in Dockerfile hinzufügen:

RUN sed -i -e "s#;sendmail_path =#sendmail_path = /usr/sbin/sendmail -t -i#g"  \
    /your_path_to/php.ini
COPY ./config/sendmail_config.sh .

Ich möchte sendmail mit meinem PHP-Programmierer, damit ich es überall einrichten kann, ohne einen Link zu einem anderen MTA-Container oder Host herstellen zu müssen, um die Aufgabe abzuschließen.
Ich starte sh sendmail_config.sh und dann mein PHP-Hilfsprogramm.

5
stuartz

Angenommen, auf dem Host ist ein Mail-Server installiert und konfiguriert!

Alpine basierte Andockbilder sollten sendmail ausführbar sein.

Die einfache Lösung besteht darin, den Container im Host-Netzwerk auszuführen:

docker run --rm --net="Host" php:fpm-Alpine sh -c 'echo "Subject: test" | sendmail -v [email protected]'

Um den Container mit der Standardnetzwerkbrücke auszuführen, konfigurieren Sie den Mail-Server, um die Docker-Schnittstelle 172.17.0.1, Zu überwachen und E-Mails vom Docker-Subnetz 172.17.0.0/16 weiterzuleiten.

Betroffene Exim-Optionen in: /etc/exim4/update-exim4.conf.conf

dc_local_interfaces='127.0.0.1 ; ::1 ; 172.17.0.1'
dc_relay_nets='172.17.0.0/16'

Starten Sie den Mailserver neu und führen Sie den Container ausführlich aus :)

docker run --rm --hostname="your-domain.com" php:fpm-Alpine sh -c 'echo "Subject: test" | sendmail -v [email protected] -S 172.17.0.1'
3
Igor Sukharev

Das Hinzufügen eines vollständig qualifizierten Domänennamens zum Docker-Host-Namen in/etc/hosts führt mich aus:

{YourDockerIP} {YouDockerHostName}.localdomain {YouDockerHostName}

Für mich sieht es so aus:

172.17.0.25 77f5a7ae8606.localdomain 77f5a7ae8606

Sie können dieses Bash-Skript auch verwenden, um diese Zeile automatisch zu aktualisieren:

#!/bin/bash
line=$(head -n 1 /etc/hosts | awk '{printf "%s %s.localdomain %s", $1, $2, $2}')
sed -e "1 s/^.*$/${line}/g" /etc/hosts > hosts
# with sed -i, it actually performs a rename of /etc/hosts, but docker does not
# allow that, so we have to use a temp file and copy it to overwrite /etc/hosts
cp hosts /etc/hosts
rm hosts

Referenz: http://hjk41.azurewebsites.net/2015/09/25/using-sendmail-inside-docker/

3
hjk41

Ich habe selbst einen Weg gefunden, obwohl nicht die eleganteste Lösung. Ich habe die Sendmail in meinem Docker so konfiguriert, dass die Anfrage über die IP des Hosts weitergeleitet wird. Fügen Sie der Datei "/ etc/mail/access" folgende Zeile hinzu

Connect:<Host_ip_here>          RELAY

Kommentieren Sie die folgende Zeile in der Datei "/etc/mail/sendmail.mc" sowohl im Host als auch im Docker aus, indem Sie "dnl #" voranstellen und "dnl" anhängen.

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')

Ich habe die Host-IP als Umgebungsvariable an den Docker-Container übergeben, damit sie konfigurierbar ist. Die sendmail des Dockers leitet nun die smtp-Anfrage von sendmail über die Host-Maschine weiter. 

2
tarun mittal

BEARBEITEN: In der xuhdev-Antwort finden Sie weitere Informationen und Informationen zum Einrichten der E-Mail-Weiterleitung. Meine Antwort kann verwendet werden, um Sendmail anstelle von Postfix auf dem Host einzurichten.

BEARBEITEN # 2: Fügen Sie eine Firewall-Regel hinzu, um SMTP-Datenverkehr vom Docker zuzulassen

Ich habe ein ähnliches Setup als tarun mittal wie folgt gemacht:

  • in der Docker-App habe ich es eingerichtet, den SMTP-Server mit der IP der Docker0-Schnittstelle zu verwenden (172.17.42.1)
  • im Docker Host die Datei /etc/mail/sendmail.mc dahingehend geändert, dass das Hören der Docker0-Schnittstelle mit einbezogen wird (im Gegensatz zu allen Schnittstellen in der Antwort von tarun - fett wird Zeile hinzugefügt)

    DAEMON_OPTIONS (`Family = Inet, Name = MTA-v4, Port = SMTP, Addr = 127.0.0.1 ') dnl

    DAEMON_OPTIONS (`Family = Inet, Name = MTA-v4, Port = SMTP, Addr = 172.17.42.1 ') dnl

  • Erlauben Sie den Zugriff von den Docker-Containern auf die Docker-Schnittstelle in der Firewall Iptables -I INPUT -s 172.17.0.0/24 -d 172.17.42.1 -dport 25 -j ACCEPT

  • in/etc/mail/access habe ich am Ende hinzugefügt, damit alle Docker-Instanzen E-Mails senden und makemap hash/etc/mail/access </ etc/mail/access die Datenbank kompilieren können

    /// BEARBEITET - NUTZEN SIE UNTEN, WENN DOCKER nach vielen Umbauten zu 172.17.1.X wechselt 

    /// ALT - Verbinden: 172.17.0 RELAY

    Verbinden Sie: 172.17 RELAY

  • Starten Sie schließlich den sendmail-Dienst erneut

1
zveljkovic

Ich habe auch mit diesem Problem zu kämpfen. Von meinem Python-Code, der in einem Docker-Container ausgeführt wird, musste ich vorübergehend E-Mails mit Postfix (SMTP-Server) senden, der auf dem Host-Computer ausgeführt wird. Nach dem Ausprobieren einer ganzen Reihe von Dingen erwies sich der Docker-Run-Befehl mit --net = "Host" als einfache Lösung. Achtung: Dies ist möglicherweise nicht in allen Fällen eine gute Lösung, da ein solcher Container den Netzwerkstack mit dem Docker-Host gemeinsam nutzt, und aus Sicht des Containers verweist localhost (oder 127.0.0.1) auf den Docker-Host . Folgendes habe ich auf einem Ubuntu-Host getan: Docker-Run -it --net = "Host" ubuntu /bin/bash Dies gab mir den Container Shell . Ich installierte dann Python in diesem Container : apt-get update && apt-get -y Supervisor python-pip installieren

Dann habe ich den Python-Interpreter gestartet und die folgenden Codezeilen abgefeuert:

import smtplib
from email.mime.text import MIMEText

fromaddr = 'testemail.yourdomain.com'
toaddr = 'youremail.yourdomain.com'

msg = MIMEText('Sample email from python/docker container')
msg['from'] = fromaddr
msg['subject'] = 'Subject of python email'
msg['to'] = toaddr

server = smtplib.SMTP('localhost')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddr, msg.as_string())
server.quit

Ich fand auch [this] [1] eine nützliche Lektüre.

1
Dean Sha

Sie müssen inet_interfaces auf die Docker-Bridge (docker0) in post fix config unter set /etc/postfix/main.cf verweisen

inet_interfaces = 

Weitere interne Arbeitsdetails unter Versenden von E-Mails vom Docker über Postfix auf Host installiert

Hinweis: Verwenden Sie den Befehl ifconfig, um die Docker-Bridge-Adresse abzurufen

0
Satish Gandham