jenkins Docker容器不接受间歇性连接

trnvg8h3  于 2023-10-17  发布在  Jenkins
关注(0)|答案(2)|浏览(156)

我有一个奇怪的问题,我似乎无法缩小范围。更糟糕的是,它是间歇性的。
我的要求:
我正在Jenkins作业上运行app1app2。首先创建app1,我获取Docker容器IP,将其放入环境变量文件并启动app2
问题是,app2会时不时地抱怨app1无法访问。请参见应用程序中的以下错误:

Failed to open TCP connection to 172.19.0.2:3006 (Connection refused - connect(2) for "172.19.0.2" port 3006

以下是我的Jenkins工作:

#!/bin/bash -e

#Create docker network app1 can talk to app2
docker network create mynetwork

#Run app1
docker run -d --name app1 --network=mynetwork -p 3006:3006 --env-file .app1vars 12345678.dkr.ecr.us-east-1.amazonaws.com/app1:latest docker/start-server.sh

#Update app2 env vars
newip=$(docker container inspect -f '{{ .NetworkSettings.Networks.mynetwork.IPAddress }}' app1)
sed -i "s/1.1.1.1/$newip/" .app1vars #1.1.1.1 is dummy IP

#Run app2
docker run -d --name app2 --network=mynetwork -p 3003 --env-file .app1vars 12345678.dkr.ecr.us-east-1.amazonaws.com/app2:latest docker/start-server.sh
docker exec app2 rake sometask

需要注意的是,我们使用EC2 plugin from Jenkins,它为每个Jenkins作业在AWS中启动一个EC2服务器。我想也许是服务器的旋转导致了问题,但事实并非如此。我们还有100多个其他工作,没有任何问题。
我执行的故障排除步骤:
1.已确认这是一个间歇性问题,因为我可以在大部分时间内成功运行此程序
1.已确保app1app2正在运行
1.证实了新的ip是正确的
你知道我该怎么做吗?

wrrgggsh

wrrgggsh1#

请检查以下内容。如果它工作正常...!
问题:您的安装程序偶尔会遇到app 2抱怨无法连接到app 1的问题,尽管大多数情况下它工作正常。
可能的原因和解决方案:
时间问题:有时,app 2可能会在app 1完全准备好接受连接之前尝试连接到app 1。
解决方案:在启动app 1之后,在启动app 2之前添加一个小延迟。您可以使用sleep命令暂停脚本几秒钟。

启动app 1后

sleep 5 #等待5秒

启动app 2

网络更新延迟:有时,IP更新可能无法及时传播到app 2,导致它使用旧的IP。
解决方案:在启动app 2之前,请仔细检查IP更新是否一致。您可以打印出更新的IP以确保其正确。Docker网络:Docker网络可能很挑剔,导致间歇性连接问题。
解决方案:使用简单的工具(如从app 2容器内ping或curl到app 1的IP)测试容器之间的连通性。如果出现问题,可能与Docker的网络设置有关。日志记录和调试:
解决方案:向app 1和app 2容器添加更多日志和诊断。这些日志可以帮助您了解在启动或运行时是否存在任何问题。重试机制:
解决方案:在app 2中实现重试机制,以处理与app 1连接失败的情况。这可以提高系统对间歇性问题的弹性。外部因素:
解决方案:虽然其他作业工作正常,但外部因素仍然会偶尔影响您的设置。密切关注可能影响容器的AWS相关事件或网络状况。请记住,一次应用一个解决方案,并在每次更改后进行彻底测试,以确定哪一个有助于缓解间歇性问题。

mspsb9vt

mspsb9vt2#

“确保app1和app2正在运行”你没有做任何特别的事情来验证app1是健康的,只是你可以检查它并获取IP地址。最简单的猜测是,偶尔app1在app2尝试连接之前没有启动。我建议在app1上使用健康检查,并在启动app2之前等待它健康。

相关问题