我有一个在Docker容器中运行的任务。我只希望它的一个实例运行,所以我给容器命名。有时,我需要修改代码或配置,以便重建映像,然后停止并重新启动具有新映像的容器。我一直在做docker stop
,然后是docker run
。
最近,我尝试将这些步骤合并为一个步骤:
docker stop myTask &&
docker run --rm -d myTask myImage:$VERSION
但是,此操作失败并显示:
docker:来自守护程序的错误响应:冲突。容器名称“ / myTask”已被容器“ 49d806e25655a5e6f5309cc5509b54a10b4f0c84e60fad39856777881c99e9ce”使用。您必须删除(或重命名)该容器才能重用该名称。
然后我尝试在其中添加docker wait
:
docker stop myTask &&
(docker wait myTask || true) &&
docker run --rm -d myTask myImage:$VERSION
我仍然会遇到这种情况。似乎docker wait
仅等待容器停止,而不等待容器被删除。然后,我尝试使用docker rm
,以为它必须在返回之前一定要等待容器被移除:
docker stop myTask &&
(docker rm myTask || true) &&
docker run --rm -d myTask myImage:$VERSION
此 still 失败,并显示“容器名称“ / myTask”已在使用”错误。
如何阻止直到没有给定名称的容器?
答案 0 :(得分:2)
停止容器与删除容器不同。容器在服务器端删除操作(已通过--rm
启用)和docker run
命令之间停止后,您便处于竞争状态。
您可以显式删除容器,而不仅仅是停止容器:
docker rm -f myTask &&
docker run --rm -d myTask myImage:$VERSION
或者您可以轮询将其删除:
docker stop myTask &&
while docker container inspect myTask >/dev/null 2>&1; do sleep 1; done &&
docker run --rm -d myTask myImage:$VERSION
答案 1 :(得分:0)
您可以改用以下命令:
docker rm -f myTask && docker run --rm -d --name myTask myImage:$VERSION
答案 2 :(得分:0)
除了等待删除,您还可以使用:
docker stop myTask && docker rename myTask myTaskStopped
docker run --rm -d myTask myImage:$VERSION
启动新容器时,已停止的容器在后台删除,而没有名称冲突。