在Jenkins-Docker容器中使用的Docker SMTP容器

时间:2019-10-31 13:48:23

标签: docker jenkins smtp docker-networking jenkins-docker

本主题与Docker网络有关,我无法允许dockerized Jenkins使用dockerized 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

在我的詹金斯容器中,我可以通过默认的“网桥”网络访问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>管理Jenkins>配置系统>电子邮件通知中,尝试使用测试电子邮件发送工具给我以下结果:

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服务器的行为有所不同?

我对Docker网络缺少什么?


编辑:因此,快速的解决方案是使用--network选项运行smtp容器,而不是先运行它,然后将其连接到网络。有关更多详细信息和适当性,请参见下面的Stefano答案。

1 个答案:

答案 0 :(得分:1)

您描述的问题与Docker网络无关。 namshi/smtp图像使用exim4作为SMTP。在此特定的exim4设置中,您需要提供允许其连接和发送电子邮件的neworks。

检查entrypoint.sh文件,发现以下命令:

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

这意味着默认情况下,它将接受来自与接口eth0和其他可能的RELAY_NETWORKS(如果定义)相关的IP地址的电子邮件。

由于默认情况下容器未连接到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