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]
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.
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.
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.
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'
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/
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.
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:
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
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.
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