Configurer sendmail dans un conteneur docker

j'ai un panneau conteneur lancer php et apache. L'hôte est dans une instance AWS qui a l'instance docker en cours d'exécution. Je ne peux pas envoyer d'e-mail depuis le terminal docker. Y a-t-il un moyen d'envoyer un e-mail depuis l'instance de docker en utilisant sendmail qui utilise la configuration de l'hôte de docker?

la commande suivante envoie un e-mail de l'hôte mais n'envoie pas un e-mail de l'instance docker. Aucune erreur n'est donné.

echo "Subject: Testing Email" | cat - text | /usr/lib/sendmail -F abc.pqr@domain.com -t abc.pqr@domain.com
15
demandé sur tarun mittal 2014-10-06 15:12:26

10 réponses

ce que je fais, c'est configurer l'hôte MTA pour qu'il écoute docker0 et installer ssmtp dans le conteneur pour relier sendmail dans le conteneur avec l'hôte MTA. La raison d'exécuter un MTA sur l'hôte est que les erreurs système (critiques) peuvent être envoyées à la boîte aux lettres de l'administrateur. La raison de ne pas exécuter MTA dans le conteneur est qu'il s'agit d'un processus dupliqué car le système hôte exécute déjà un MTA.

sur l'hôte, j'ai utilisé postfix. Tout ce que nous avons à faire est de configurer postfix pour écouter docker0 et accepter les courriers envoyés par Docker containers. Modifiez le fichier /etc/postfix/main.cfdocker0 adresse IP à inet_interfaces il accepte donc les connexions des conteneurs Docker. Aussi, ajouter les adresses réseau des conteneurs Docker mynetworks de sorte que les conteneurs Docker sont légaux pour envoyer des mails via le serveur postfix sur l'hôte. (référence et plus de détails)

pour utiliser sendmail dans les conteneurs, installer ssmtp et définir FromLineOverride pour être autorisé et et mailhub à l'adresse IP de l'hôte /etc/ssmtp/ssmtp.conf. Vous pouvez définir mailhub pour être un symbole tel que smtp-server puis lancer le conteneur avec --add-host option, comme indiqué dans ce fichier Dockerfile (à exécuter avec --add-host smtp-server:your-docker0-address). Cela configurerait un sendmail utilisable dans des conteneurs qui utiliserait en fait l'hôte MTA pour envoyer des mails.

16
répondu xuhdev 2015-05-04 02:06:42

en s'appuyant sur les réponses précédentes,

créer config/sendmail_config.sh avec:

#!/bin/sh
# set host in hosts
line=$(head -n 1 /etc/hosts)
line2=$(echo $line | awk '{print }')
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

changer yum pour apt-get sur les conteneurs debian

puis dans Dockerfile ajouter:

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 .

je veux sendmail avec mon util php de sorte que je puisse le coller n'importe où sans avoir à lier à un autre conteneur MTA ou hôte pour accomplir la tâche.

Je cours sh sendmail_config.sh, et ensuite lancer mon php util.

5
répondu stuartz 2016-12-01 19:34:56

nulle part dans votre fichier Dockerfile sendmail (ou tout autre agent de messagerie) n'est installé. L'hôte, cependant, a apparemment sendmail disponible. La" meilleure " ou la solution la plus similaire à Docker est de lancer un autre conteneur qui fonctionne avec un MTA (comme postfix ou import), et configurer votre application pour utiliser cela.

4
répondu naneau 2014-10-07 14:21:50

j'ai moi-même trouvé un moyen, mais pas la solution la plus élégante. J'ai configuré le sendmail à l'intérieur de mon docker de manière à relayer la requête via l'ip de l'hôte. Ajouter la ligne suivante au fichier " / etc / mail / access

Connect:<host_ip_here>          RELAY

Aussi, dans l'accueillir ainsi que le panneau, commentez la ligne suivante dans le fichier "/etc/mail/sendmail.mc" en préfixant avec "dnl #" et suffixant avec "dnl".

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

j'ai passé l'ip de l'hôte comme variable d'environnement au docker conteneur, de sorte qu'il est configurable. Maintenant, sendmail du docker va relayer la requête smtp de sendmail via la machine hôte.

2
répondu tarun mittal 2014-10-10 05:59:09

Ajouter un nom de domaine pleinement qualifié au nom d'hôte Docker dans /etc / hosts fait l'affaire pour moi:

{YourDockerIP} {YouDockerHostName}.localdomain {YouDockerHostName}

Pour moi, il ressemble à ceci:

172.17.0.25 77f5a7ae8606.localdomain 77f5a7ae8606

Vous pouvez également utiliser ce script bash pour mettre à jour automatiquement cette ligne:

#!/bin/bash
line=$(head -n 1 /etc/hosts | awk '{printf "%s %s.localdomain %s", , , }')
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

référence:http://hjk41.azurewebsites.net/2015/09/25/using-sendmail-inside-docker/

2
répondu hjk41 2015-09-25 14:18:08

en Supposant qu'il existe un serveur de messagerie installé et configuré sur l'hôte!

Alpin les images basées sur docker devraient avoir sendmail exécutable.

la solution simple est d'exécuter le conteneur sur le réseau de l'hôte:

docker run --rm --net="host" php:fpm-alpine sh -c 'echo "Subject: test" | sendmail -v your@mail.com'

Pour exécuter le conteneur par défaut pont réseau, configurer le serveur de messagerie pour écouter sur l'interface docker 172.17.0.1, et permettre de relayer les e-mails du sous-réseau docker 172.17.0.0 / 16.

Exim options affectées dans: / 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'

redémarrez le serveur de messagerie et lancez le conteneur verbose:)

docker run --rm --hostname="your-domain.com" php:fpm-alpine sh -c 'echo "Subject: test" | sendmail -v your@mail.com -S 172.17.0.1'
2
répondu Igor Sukharev 2017-08-27 17:28:41

EDIT: Veuillez voir xuhdev réponse pour plus d'informations et comment configurer mail expéditeur. Ma réponse peut être utilisée pour configurer sendmail au lieu de postfix sur host.

EDIT #2: Ajouter une règle de pare-feu pour autoriser le trafic smtp de docker

j'ai fait une similaire configuration que le tarun mittal comme suit:

  • dans l'application docker Je l'ai configuré pour utiliser le serveur smtp avec l'ip de l'interface docker0 (172.17.42.1)
  • dans docker host, modifié le /etc/mail/sendmail.mc à inclure à l'écoute sur le docker0 interface (contrairement à toutes les interfaces de tarun la réponse de gras est ajouté la ligne)

    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

  • permettre l'accès des conteneurs docker à l'interface docker dans le pare-feu iptables-I INPUT-s 172.17.0.0 / 24-d 172.17.42.1 -dport 25-j ACCEPT

  • dans /etc/mail/access, j'ai ajouté à la fin pour permettre à tous docker instances pour envoyer des emails et makemap hash / etc / mail / access < /etc/mail / access pour compiler la base de données

    / / EDITED-USE BELOW AS DOCKER WILL GO TO 172.17.1.X après de nombreuses reconstructions

    /// OLD - Connect:172.17.0 RELAY

    Connexion:172.17 RELAIS

  • enfin redémarrer sendmail-service sendmail redémarrez

1
répondu zveljkovic 2017-04-13 09:58:12

j'ai du mal avec cette question. À partir de mon code python tournant dans un conteneur docker, j'ai dû Temporairement envoyer des e-mails en utilisant postfix (serveur smtp) tournant sur la machine hôte. Après avoir essayé tout un tas de choses, ce qui s'est avéré être une solution simple était docker run command avec --net="host". Attention: ce n'est peut-être pas une bonne solution dans tous les cas car un tel conteneur partagera la pile réseau avec l'hôte docker et du point de vue du conteneur, localhost(ou 127.0.0.1) va consulter le panneau d'accueil. Voici ce que j'ai fait sur un hôte ubuntu: docker run- --nette="accueil" ubuntu /bin/bash Cela m'a donné l'enceinte. J'ai ensuite installé python dans ce conteneur: apt-get update && apt-get-y install superviseur python-pip

Puis j'ai lancé l'interpréteur python et a tiré les lignes de code suivantes:

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

j'ai aussi trouvé [ceci][1] une lecture utile.

1
répondu Dean Sha 2017-07-06 17:46:56

Selon le manuel de Sendmail nous pouvons utiliser sendmail -bd commande pour exécuter un service. Mais il existe avec zéro statut. Si...

# In your Dockerfile
RUN yum install -y sendmail
# Run mail listener
RUN sendmail -bd

CMD sleep infinity
# or run your command

vous pouvez également utiliser supervisord. J'utilise cette configuration:

[program:sendmail]
command=/usr/sbin/sendmail -bd
autostart=true
autorestart=false
numprocs=1
startretries=0

Et de le tester:

$ echo test123 | sendmail your@mail.com

N'oubliez pas de vérifier le dossier Spam.

0
répondu Kirby 2016-11-21 03:26:42

vous devez pointer inet_interfaces vers docker bridge (docker0) dans la configuration de post fix située à set /etc/postfix/main.cf

inet_interfaces =

plus de détails de travail interne à envoyer un e-mail depuis docker via postfix installé sur l'hôte

Note: utilisez la commande ifconfig pour obtenir l'adresse du pont docker

0
répondu Satish Gandham 2017-01-20 08:41:34