web-dev-qa-db-fra.com

Configurer sendmail dans un conteneur de menu fixe

J'ai un conteneur docker php et Apache. L'hôte se trouve dans une instance AWS sur laquelle l'instance de docker est en cours d'exécution. Je ne parviens pas à envoyer un courrier électronique à partir du terminal de docker. Existe-t-il un moyen d'envoyer un courrier électronique à partir d'une instance de docker à l'aide de sendmail utilisant la configuration de l'hôte du docker?

La commande suivante envoie un courrier électronique à partir de l'hôte mais n'envoie pas un courrier électronique à partir de l'instance de menu fixe. Aucune erreur n'est donnée non plus.

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

Ce que je fais est de configurer le MTA hôte pour écouter sur docker0 et installer ssmtp dans le conteneur pour relier sendmail dans le conteneur avec le MTA hôte. 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 pour 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 qu’il écoute sur docker0 et d’accepter les mails sortants des conteneurs Docker. Editez le fichier /etc/postfix/main.cf et ajoutez l'adresse IP docker0 à inet_interfaces pour qu'il accepte les connexions des conteneurs Docker. Ajoutez également les adresses réseau des conteneurs Docker à mynetworks afin que les conteneurs Docker puissent envoyer des messages via le serveur postfix sur l’hôte. ( référence et plus de détails )

Pour utiliser sendmail dans des conteneurs, installez ssmtp et définissez FromLineOverride pour être autorisé et and mailhub sur l'adresse IP de l'hôte dans /etc/ssmtp/ssmtp.conf. Vous pouvez définir mailhub comme un symbole tel que smtp-server, puis exécuter le conteneur avec l'option --add-Host, comme indiqué dans ce fichier Dockerfile (exécutez-le avec --add-Host smtp-server:your-docker0-address). Cela configurerait un sendmail utilisable dans des conteneurs qui utiliseraient réellement le MTA hôte pour envoyer des mails.

19
xuhdev

Sendmail (ou tout autre agent de messagerie) n'est installé nulle part dans votre fichier Docker. Cependant, l'hôte dispose apparemment de sendmail. La solution "la meilleure" ou la plus semblable à celle de Docker consiste à créer un autre conteneur qui exécute un MTA (comme postfix ou exim ) et à configurer votre application pour l'utiliser.

5
naneau

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 $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

change yum pour apt-get sur des conteneurs basés sur debian

puis dans Dockerfile, ajoutez:

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 utilitaire php pour pouvoir le coller n'importe où sans avoir à se connecter à un autre conteneur ou hôte MTA pour effectuer la tâche.
J'exécute sh sendmail_config.sh, puis mon utilitaire php.

5
stuartz

Ajouter un nom de domaine complet au nom d'hôte Docker dans/etc/hosts me facilite la tâche:

{YourDockerIP} {YouDockerHostName}.localdomain {YouDockerHostName}

Pour moi, cela 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", $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

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

3
hjk41

J'ai trouvé un moyen moi-même, bien que ce ne soit pas la solution la plus élégante. J'ai configuré le sendmail dans mon menu fixe afin de relayer la demande via l'adresse IP de l'hôte. Ajoutez la ligne suivante au fichier "/ etc/mail/access

Connect:<Host_ip_here>          RELAY

En outre, dans l'hôte ainsi que dans le menu fixe, commentez la ligne suivante dans le fichier "/etc/mail/sendmail.mc" en la préfixant par "dnl #" et en la complétant par "dnl".

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

J'ai transmis l'ip de l'hôte en tant que variable d'environnement au conteneur de menu fixe, de sorte qu'il soit configurable. Maintenant, le sendmail du docker va relayer sa demande smtp de sendmail via la machine hôte. 

2
tarun mittal

EDIT: S'il vous plaît voir la réponse de xuhdev pour plus d'informations et comment configurer le redirecteur de courrier. 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 à partir du menu fixe

J'ai fait une configuration similaire à celle du tarun mittal comme suit:

  • dans l'application Docker, je l'ai configuré pour utiliser le serveur SMTP avec l'adresse IP de l'interface Docker0 (172.17.42.1)
  • dans docker Host, modification du fichier /etc/mail/sendmail.mc pour inclure l'écoute sur l'interface docker0 (contrairement à toutes les interfaces de la réponse de tarun - la ligne en gras est ajoutée)

    DAEMON_OPTIONS (`Famille = inet, Nom = MTA-v4, Port = smtp, Addr = 127.0.0.1 ') dnl

    DAEMON_OPTIONS (`Famille = inet, Nom = MTA-v4, Port = smtp, Addr = 172.17.42.1 ') dnl

  • Autorisez l'accès des conteneurs du menu fixe à l'interface du menu fixe 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 à toutes les instances de docker d’envoyer des emails et makemap hash/etc/mail/access </ etc/mail/access pour compiler la base de données

    /// RÉVISÉ - UTILISER CI-DESSOUS, DOCKER PASSANT À 172.17.1.X après de nombreuses reconstructions 

    /// OLD - Connect: 172.17.0 RELAY

    Connecter: 172.17 RELAIS

  • Enfin redémarrez sendmail - service sendmail restart

1
zveljkovic

J'ai eu du mal avec ce problème aussi. À partir de mon code python s'exécutant dans un conteneur Docker, je devais envoyer temporairement des courriels à l'aide de postfix (serveur smtp) exécuté sur la machine hôte. Après avoir essayé tout un tas de choses, ce qui s’est avéré être une solution simple est la commande d'exécution de docker avec --net = "Host". Attention: Cela peut ne pas être 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) désignera l'hôte docker . Voici ce que j'ai fait sur un hôte Ubuntu: Docker run -it --net = "Host" ubuntu /bin/bash Cela m'a donné le conteneur Shell . J'ai ensuite installé python dans ce conteneur : apt-get update && apt-get -y superviseur d'installation python-pip

Ensuite, j'ai lancé l'interpréteur python et lancé 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
Dean Sha

Vous devez pointer inet_interfaces sur le docker bridge (docker0) dans la configuration post-fix située dans le groupe /etc/postfix/main.cf

inet_interfaces = 

Plus de détails internes sur envoi d’email depuis docker via postfix installé sur l’hôte

Remarque: utilisez la commande ifconfig pour obtenir l'adresse du pont fixe

0
Satish Gandham