我有一个Jenkins工作,在一夜之间将docker容器替换为最新的映像。通常这可以正常工作,但偶尔会失败并显示以下错误:
docker: Error response from daemon: Conflict. The container name "/demo-api" is already in use by container
Jenkins作业使用以下内容:
docker stop demo-api
./api_container.sh
api_container.sh
执行docker pull
和docker run --name demo-api -t -d --rm
。
但是,当我ssh
在发生故障后的早晨开始并运行docker ps
时,该容器不再运行,因此它似乎最终停止了,只是没有及时docker run
尝试使用新图像启动它的命令。
问题
docker stop
命令在返回之前是否不会阻塞?
我应该在Jenkins工作脚本中以不同的方式处理吗?
我已经看到还有一个docker wait
命令。我是否也应该在脚本中使用它?
答案 0 :(得分:2)
请确保您在这里有比赛条件。 --rm
生效之前,停止将返回。因此,这是引擎处理的--rm
与api_container.sh
脚本之间的竞赛。
我会使用明确的docker rm
来避免比赛。请注意,docker rm
可能会根据--rm
的处理位置而失败,因此我会短暂睡眠以确保已完成。
docker stop demo-api
docker rm demo-api || sleep 5
./api_container.sh
或者您可以切换到docker rm -f
,它将一步一步杀死并删除容器。可能是您真正想要的东西,并且不太容易出错,但是如果应用程序不正常地死机,则可能会使卷处于不良状态。
docker rm -f demo-api
./api_container.sh
答案 1 :(得分:0)
docker stop
将停止您的容器。
所有停止的容器都可以在此命令中找到。
docker ps --filter "status=exited
您收到的错误消息为The container name "/demo-api" is already in use by container
这意味着已经有一个使用demo-api
名称的容器,这是正确的,因为停止docker容器不会删除该容器,并且该容器名称将存在。
您所要做的就是
两个
运行docker run
命令,而无需指定为容器--name
命名的demo-api
选项。这样,每次您的脚本提取并运行容器时,它将获得一个新的随机容器名称。
OR
如果您要保持容器名称相同demo-api
,而不是使用docker stop
停止容器,只需将容器全部移到docker rm -f demo-api
更新
我刚刚看到您更新了问题。
停止使用--rm
选项运行的容器应删除该容器
容器在一起。
您发现的错误似乎仅在该名称已被另一个容器使用时才存在。
到目前为止,您可以尝试在while循环中运行脚本,并检查该脚本是否在此运行期间发生。
这是我使用的脚本(但没有任何问题),请在发生此问题的特定计算机上尝试使用此脚本。
#!/bin/bash
i=20
while [ $i -gt 0 ]
do
docker stop demo-api
docker pull alpine
docker run --name demo-api -t -d --rm alpine sh
i=$((i - 1))
done