我有一个奇怪的问题,我似乎无法缩小范围。更糟糕的是,它是间歇性的。
我的要求:
我正在Jenkins作业上运行app1和app2。首先创建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.已确保app1和app2正在运行
1.证实了新的ip是正确的
你知道我该怎么做吗?
2条答案
按热度按时间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相关事件或网络状况。请记住,一次应用一个解决方案,并在每次更改后进行彻底测试,以确定哪一个有助于缓解间歇性问题。
mspsb9vt2#
“确保app1和app2正在运行”你没有做任何特别的事情来验证app1是健康的,只是你可以检查它并获取IP地址。最简单的猜测是,偶尔app1在app2尝试连接之前没有启动。我建议在app1上使用健康检查,并在启动app2之前等待它健康。