Docker 在 Jenkins 中使用的 SMTP 容器-Docker 容器
Docker SMTP container to use in Jenkins-Docker container
这个主题是关于 Docker 网络的,我不能让 dockerised Jenkins 使用 dockerised 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 容器中,我可以通过默认 'bridge' 网络访问 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 notification 中,尝试使用测试电子邮件发送工具得到以下结果:
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
=>同样的错误
为什么使用 2 个网络时 SMTP 服务器的行为不同?
关于 Docker 网络我错过了什么?
编辑: 所以快速的解决方案是 运行 带有 --network 选项的 smtp 容器,而不是 运行 连接它然后连接它到网络。有关详细信息和充分性,请参阅下面的 Stefano 回答。
您描述的问题与 docker 网络无关。 namshi/smtp
图像使用 exim4 作为 SMTP。在此特定的 exim4 设置中,您需要提供允许连接和发送电子邮件的网络。
查看entrypoint.sh文件,发现如下命令:
dc_relay_nets "$(ip addr show dev eth0 | awk ' == "inet" { print }' | 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
这个主题是关于 Docker 网络的,我不能让 dockerised Jenkins 使用 dockerised 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 容器中,我可以通过默认 'bridge' 网络访问 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 notification 中,尝试使用测试电子邮件发送工具得到以下结果:
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
=>同样的错误
为什么使用 2 个网络时 SMTP 服务器的行为不同?
关于 Docker 网络我错过了什么?
编辑: 所以快速的解决方案是 运行 带有 --network 选项的 smtp 容器,而不是 运行 连接它然后连接它到网络。有关详细信息和充分性,请参阅下面的 Stefano 回答。
您描述的问题与 docker 网络无关。 namshi/smtp
图像使用 exim4 作为 SMTP。在此特定的 exim4 设置中,您需要提供允许连接和发送电子邮件的网络。
查看entrypoint.sh文件,发现如下命令:
dc_relay_nets "$(ip addr show dev eth0 | awk ' == "inet" { print }' | 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