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

docker容器名称有时在停止后已在使用,docker,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\u container.sh执行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\u container.sh
执行
docker拉取
docker运行--name demo api-t-d--rm

但是,当我在发生故障后的早上打开
ssh
并运行
docker ps
时,容器不再运行,因此看起来它最终停止了,只是没有及时执行尝试使用新映像启动容器的
docker run
命令

问题
该命令在返回之前不会阻塞吗?
我应该在詹金斯的工作脚本中以不同的方式处理这个问题吗?

我看到还有一个命令。我应该在我的脚本中也使用它吗

docker stop
将停止您的集装箱

在此命令中可以找到所有已停止的容器

docker ps--filter“状态=退出

您得到的错误是容器名“/demo-api”已被容器使用

这意味着已经有一个容器使用了
演示api
名称,这是正确的,因为停止docker容器不会删除该容器,并且该容器名称将存在

你所要做的就是

或者

运行
docker Run
命令,但不指定为容器命名的
--name
选项
演示api
。这样,每次脚本提取并运行容器时,它都将获得一个新的随机容器名

如果您想保持容器名称不变
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

docker stop
将停止您的集装箱

在此命令中可以找到所有已停止的容器

docker ps--filter“状态=退出

您得到的错误是容器名“/demo-api”已被容器使用

这意味着已经有一个容器使用了
演示api
名称,这是正确的,因为停止docker容器不会删除该容器,并且该容器名称将存在

你所要做的就是

或者

运行
docker Run
命令,但不指定为容器命名的
--name
选项
演示api
。因此,每次脚本拉取并运行容器时,它都会得到一个新的随机容器名称

如果您想保持容器名称不变
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

很确定你在这里有比赛条件。停止将在
--rm
生效之前返回。因此,这是引擎处理的
--rm
api\u 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

很确定你在这里有比赛条件。停止将在
--rm
生效之前返回。因此,这是引擎处理的
--rm
api\u 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

我为这个问题添加了一些更详细的内容:我使用
docker run
--rm
一起运行,因此容器在退出时被移除。我不明白的是,为什么这只会在大多数晚上间歇性地失败。我为这个问题添加了更多细节:我使用
docker run
--rm
一起运行,所以容器在退出时被移除。我不明白的是,为什么这只是间歇性地失败,大多数晚上它都能工作。我不知道根本原因,但如果它发生了,那么使用
docker ps-a | grep demo api
来检测它在
docker run--name demo api-t-d--rm之前是否存在。
似乎是唯一的方法。我不知道根本原因,但如果它发生了,然后使用
docker