Этот раздел посвящен сети 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 вместо того, чтобы запускать его и затем подключать к сети. См. Ответ Стефано ниже для получения более подробной информации и адекватности.