停止后有时已使用docker容器名称

时间:2019-06-19 08:31:29

标签: docker

我有一个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 pulldocker run --name demo-api -t -d --rm

但是,当我ssh在发生故障后的早晨开始并运行docker ps时,该容器不再运行,因此它似乎最终停止了,只是没有及时docker run尝试使用新图像启动它的命令。

问题
docker stop命令在返回之前是否不会阻塞?
我应该在Jenkins工作脚本中以不同的方式处理吗?
我已经看到还有一个docker wait命令。我是否也应该在脚本中使用它?

2 个答案:

答案 0 :(得分:2)

请确保您在这里有比赛条件。 --rm生效之前,停止将返回。因此,这是引擎处理的--rmapi_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
相关问题