docker容器名称有时在停止后已在使用
我有一份Jenkins的工作,一夜之间用最新的图像替换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拉
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