2014-10-06 2 views
13

У меня есть docker container работающих php и apache. Хост находится в экземпляре AWS, в котором запущен экземпляр докера. Я не могу отправить электронное письмо с терминала докера. Есть ли способ отправить сообщение электронной почты из экземпляра docker с помощью sendmail, который использует конфигурацию хоста докера?Настройка sendmail внутри контейнера докера

Следующая команда отправляет электронное письмо с хоста, но не отправляет электронное письмо с экземпляра docker. Ошибка не указана.

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

Какой MTA предоставляет вам с программой sendmail?[sendmail/postfix/exim] – AnFi

+0

sendmail-8.12 + устанавливается по умолчанию в качестве установленного идентификатора GROUP. Согласно комментарию в http://stackoverflow.com/a/23157832/2139766 docker по умолчанию запрещает запуск программ set set id. – AnFi

+0

Я надеюсь, что этот комментарий поможет как-то: https://github.com/docker-library/php/issues/135#issuecomment-277199026 – Charaf

ответ

4

Нигде в вашем файле Docker не установлен sendmail (или любой другой почтовый агент). Однако у хоста, видимо, есть sendmail. «Лучшим» или большинством Docker-подобных решений является разворачивание другого контейнера, который запускает MTA (например, postfix или exim), и настройте приложение для его использования.

+1

Да, это можно сделать, указав «[Ссылки] (https: //docs.docker .com/v1.8/compose/yml/# links) 'в файле компоновки docker. Но у меня уже есть хороший рабочий постфиксный сервер, запущенный на хосте, как я могу подключиться из контейнера Docker к серверу Postfix хоста (который также запускает контейнер докера). – danger89

2

Я понял путь сам, хотя и не самый изящный вариант. Я настроил sendmail внутри моего докера, чтобы передать запрос через ip хоста. Добавьте следующую строку в файл «/ и т.д./почта/доступ

Connect:<host_ip_here>   RELAY 

Кроме того, в хозяине, а также докер, закомментируйте следующую строку в файле„/etc/mail/sendmail.mc“по предварив его «DnL #» и суффиксов с «DNL».

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

Я прошел Host IP в качестве переменной окружения контейнера Докер, так что это настраивается. Теперь Sendmail докер будет ретранслировать его SMTP Sendmail в запрос через хост-машину.

1

EDIT: см. ответ xuhdev для получения дополнительной информации и для настройки почтового отправителя. Мой ответ можно использовать для настройки sendmail вместо postfix на хосте.

EDIT # 2: Добавить правило брандмауэра, чтобы Smtp трафик от докер

Я сделал похожую установку как Tarun Mittal следующим образом:

  • в Докер приложение, которое я установить его использовать smtp-сервер с ip-интерфейсом docker0 (172.17.42.1)
  • в докере-хосте, модифицированный /etc/mail/sendmail.mc, чтобы включить прослушивание интерфейса docker0 (в отличие от всех интерфейсов в ответе таруна - полужирный добавляется линия)

    DAEMON_OPTIONS (`Семейный = инет, Name = MTA-v4, Port = SMTP, Addr = 127.0.0.1') DNL

    DAEMON_OPTIONS (` Семейный = инет, Name = MTA-v4, Port = SMTP, Addr = 172.17.42.1') DNL

  • Разрешить доступ из докеров контейнеров докер интерфейс в брандмауэров IPTables -I ВХОДА -s 172.17.0.0/24 -d 172.17.42.1 -dport 25 -j ACCEPT

  • в/etc/mail/access Я добавил в конце, чтобы все экземпляры докеров отправляли электронные письма и makemap hash/etc/mail/acc ess </etc/mail/access для компиляции базы данных

    /// ИЗДЕЛИЕ - ИСПОЛЬЗУЙТЕ НИЖЕ КАК ДОКЕР ДОЛЖЕН ПЕРЕХОДИТЬ В 172.17.1.X после многих перестраивает

    /// OLD - Connect: 172.17.0 РЕЛЕ

    Connect: 172,17 РЕЛЕ

  • Наконец перезапустить Sendmail - сервис Sendmail перезагрузка

+0

Проблема не будет решена, если приложение Docker будет жестко закодировано для использования программы 'sendmail'. – xuhdev

+0

Да, ваше решение лучше, так как позволяет этот сценарий. – zveljkovic

14

Что я делаю для настройки хоста MTA для прослушивания на docker0 и установки ssmtp в контейнере для переноса sendmail в контейнер с помощью MTA хоста. Причиной запуска MTA на хосте является то, что системные (критические) ошибки могут быть отправлены в почтовый ящик администратора. Причина не запускать MTA в контейнере заключается в том, что это дублированный процесс, поскольку хост-система уже запускает MTA.

На хосте я использовал постфикс. Все, что нам нужно сделать, это настроить постфикс для прослушивания на docker0 и принять исходящие письма из контейнеров Docker. Отредактируйте файл /etc/postfix/main.cf и добавьте docker0 IP-адрес в inet_interfaces, чтобы он принимал соединения из контейнеров Docker. Кроме того, добавьте сетевые адреса контейнеров Docker в mynetworks, чтобы контейнеры Docker были законными для отправки писем через постфиксный сервер на хосте. (reference and more details)

Чтобы использовать Sendmail в контейнерах, установить SSMTP и установить FromLineOverride быть разрешены и mailhub и на IP-адрес хоста в /etc/ssmtp/ssmtp.conf. Вы можете установить mailhub как символ, такой как smtp-server, а затем запустить контейнер с опцией --add-host, как показано в этом Dockerfile (запустите его с помощью --add-host smtp-server:your-docker0-address). Это позволит настроить полезный sendmail в контейнерах, которые фактически будут использовать MTA хоста для отправки писем.

+3

Это работает и получает исполняемый файл командной строки sendmail. Но в чем же проблема с «реальным» исполняемым файлом sendmail. Если я не получу что-то не так, возможно, что это будет возможно, если вы не настроите свой собственный сервер smtp - данные работы dns mx lookups и доступ к MTA-получателям доступны. –

2

Добавление полное доменное имя к имени хоста Докер в/и т.д./хостов делает трюк для меня:

{YourDockerIP} {YouDockerHostName}.localdomain {YouDockerHostName} 

Для меня это выглядит так:

172.17.0.25 77f5a7ae8606.localdomain 77f5a7ae8606 

Вы также можете используйте этот Баш скрипт для автоматического обновления строки:

#!/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 

Ссылка: http://hjk41.azurewebsites.net/2015/09/25/using-sendmail-inside-docker/

+0

Как следует из источника источника, это не работает постоянно: http://www.tothenew.com/blog/setting-up-sendmail-inside-your-docker-container/ К сожалению, я делаю не знаю, почему это для некоторых пользователей, похоже, работает, а для других нет. –

+0

Простой способ: 'RUN echo -e '$ (hostname -i) \ t $ (имя хоста) $ (имя хоста) .localhost" >>/etc/hosts' –

+0

Я один из неудачников, где это не работает, запуск хоста Windows. Я могу использовать функцию php mail, чтобы получить ответ 1, и я вижу кэшированные сообщения в '/ var/spool/mqueue', но они никогда не доходят до адресов, на которые они отправлены. –

1

Я тоже боролся с этой проблемой. Из моего кода python, запущенного внутри контейнера докеров, мне нужно было временно отправить электронные письма с помощью постфикса (smtp-сервера), запущенного на главной машине. После того, как вы пробовали целую кучу вещей, то, что оказалось простым решением, было командой docker run с --net = "host". Внимание. Это не может быть хорошим решением во всех случаях, так как такой контейнер будет совместно использовать сетевой стек с хостом докера и с точки зрения контейнера, localhost (или 127.0.0.1) будет ссылаться на хост докера. Вот что я сделал на хосте ubuntu: docker run -it --net = "host" ubuntu/bin/bash Это дало мне контейнерную оболочку. Затем я установил питона в этом контейнере: APT-получить обновления & & APT-получить -y установить супервизор питон-пип

Затем я запустил интерпретатор питона и обжигают следующие строки кода:

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 

Я также нашел [это] [1] полезное чтение.

0

В соответствии с the Sendmail manual мы можем использовать команду sendmail -bd для запуска службы. Но он существует с нулевым статусом. Так ...

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

CMD sleep infinity 
# or run your command 

Также вы можете использовать supervisord. Я использую этот конфиг:

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

И проверить:

$ echo test123 | sendmail [email protected] 

Не забудьте проверить папку Спам.

4

здание на предыдущих ответах,
создать конфиг/sendmail_config.sh с:

#!/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 

изменение ням для APT-получить на Debian на базе контейнеров

затем в Dockerfile добавить:

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 . 

Я хочу, чтобы sendmail с моим php util, чтобы я мог вставлять его в любом месте без для связи с другим контейнером MTA или хостом для выполнения задачи.
Я запускаю sh sendmail_config.sh, а затем запускаю свой php util.

+0

Для меня это работало после того, как я заменил 'echo '$ line $ line2.localdomain" >>/etc/hosts' на 'echo' $ line $ line2.localdomain $ (имя хоста)" >>/etc/hosts' –

+1

Doesn ' t работает с докер-составом./ect/hosts заменяется докером при запуске контейнера. Вместо использования extra_hosts: - "localhost.localdomain: 127.0.0.1" в файле docker-compose.yml – ratm

0

Вы должны указать inet_interfaces на докер мост (docker0) в пост исправления конфигурации, расположенной в наборе /etc/postfix/main.cf

inet_interfaces =

Более внутренняя рабочая деталь на sending email from docker via postfix installed on host

Примечание: используйте команду ifconfig для получения адреса моста докера

2

Предполагая, что на хосте установлен и настроен почтовый сервер!

Alpine Докер Изображения, должны иметь sendmail исполняемый файл.

Самое простое решение для запуска контейнера на хосте»сети:

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

Чтобы запустить контейнер с сетью по умолчанию мост, почтовый сервер настроить для прослушивания интерфейса Docker 172.17.0.1, и разрешить передачу сообщений электронной почты из подсети докеров 172.17.0.0/16.

Exim варианты затронуты: /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' 

Restart и запустить контейнер многословным :)

docker run --rm --hostname="your-domain.com" php:fpm-alpine sh -c 'echo "Subject: test" | sendmail -v [email protected] -S 172.17.0.1' 
Смежные вопросы