如何等待Docker容器被删除

时间:2019-08-23 18:55:28

标签: docker

我有一个在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”已在使用”错误。

如何阻止直到没有给定名称的容器?

3 个答案:

答案 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

启动新容器时,已停止的容器在后台删除,而没有名称冲突。