Контейнер Docker SMTP для использования в контейнере Jenkins-Docker

Этот раздел посвящен сети Docker, которую я не могу разрешить, чтобы докеризованный Jenkins мог использовать докеризированный SMTP-сервер.

Вот как я запускаю свои контейнеры и подключаю их к определяемой пользователем сети, чтобы имя контейнера можно было использовать в качестве целевого хоста:

# Run Jenkins image, with port binding, Docker sock sharing, and configuration sharing
docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v /root/jenkins_conf/:/var/jenkins_home/ --name jenkins jenkins/jenkins:lts

# Run SMTP image
docker run -d --name smtp namshi/smtp

# Create user-defined network
docker network create jenkins-net

# Connect both containers
docker network connect jenkins-net jenkins
docker network connect jenkins-net smtp

В моем контейнере jenkins я могу получить доступ к службе smtp через сеть «мост» по умолчанию:

$ (echo >/dev/tcp/172.17.0.5/25) &>/dev/null && echo "open" || echo "close"
open

и я также могу связаться с ним через мою пользовательскую сеть, как по IP, так и по имени хоста:

$ (echo >/dev/tcp/172.18.0.3/25) &>/dev/null && echo "open" || echo "close"
open
$ (echo >/dev/tcp/smtp/25) &>/dev/null && echo "open" || echo "close"
open

Пока все хорошо.

Но затем, в Jenkins> Manage Jenkins> Configure System> E-mail уведомление, попытка использовать тестовый инструмент отправки электронной почты дает мне следующие результаты:

SMTP server: 172.17.0.5 (SMTP container IP on the default 'bridge' network)
SMTP port: 25

=> письмо отправлено и получено должным образом!

SMTP server: 172.18.0.3 (SMTP container IP on my user-defined 'jenkins-net' network)
SMTP port: 25

=> Не удалось отправить электронное письмо com.sun.mail.smtp.SMTPAddressFailedException: ретрансляция 550 не разрешена

SMTP server: smtp (SMTP container name on my user-defined 'jenkins-net' network)
SMTP port: 25

=> та же ошибка

Почему разница в поведении SMTP-сервера между использованием 2-х сетей?

Что мне не хватает в сети Docker?


Редактировать: Таким образом, быстрое решение состояло в том, чтобы запустить smtp-контейнер с параметром --network вместо того, чтобы запускать его и затем подключать к сети. См. Ответ Стефано ниже для получения более подробной информации и адекватности.


person Bob    schedule 31.10.2019    source источник


Ответы (1)


Описанная вами проблема не связана с сетью докеров. Образ namshi/smtp использует exim4 в качестве SMTP. В этой конкретной настройке exim4 вы должны указать сети, откуда разрешено подключаться и отправлять электронную почту.

Проверяя файл entrypoint.sh, я нашел следующую команду :

dc_relay_nets "$(ip addr show dev eth0 | awk '$1 == "inet" { print $2 }' | xargs | sed 's/ /:/g')${RELAY_NETWORKS}"

Это означает, что по умолчанию он будет принимать электронные письма, приходящие с IP-адреса, связанного с интерфейсом eth0 и другими возможными RELAY_NETWORKS (если они определены).

Поскольку контейнер по умолчанию не подключен к сети jenkins-net при создании, он не будет распознавать электронные письма, приходящие с этого адреса.

Попробуйте запустить контейнеры так:

docker network create jenkins-net
SUBNET=$( docker network inspect \
    -f '{{range .IPAM.Config}}{{.Subnet}}{{end}}' \
    jenkins-net )

docker run -d \
    --network jenkins-net \
    -e RELAY_NETWORKS=":${SUBNET}" \
    --name smtp \
    namshi/smtp

docker run -d \
    -p 8080:8080 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /root/jenkins_conf/:/var/jenkins_home/ \
    --network jenkins-net \
    --name jenkins \
    jenkins/jenkins:lts
person Stefano    schedule 31.10.2019
comment
Интересно ! На самом деле кажется, что подключение smtp-контейнера к jenking-net /after/ запуска контейнера является причиной проблемы, а его запуск с параметром --network jenkins-net приносит ожидаемые результаты. В моих текущих тестах я обнаружил, что добавлять -e RELAY_NETWORKS не нужно. Ты бы согласился с этим? - person Bob; 31.10.2019
comment
Я согласен для этого конкретного случая. Я добавил RELAY_NETWORKS для безопасности: если у вас есть более 1 сети, определения сетей при создании контейнера будет недостаточно. - person Stefano; 31.10.2019