如何等待移除Docker容器

如何等待移除Docker容器,docker,Docker,我有一个在docker容器中运行的任务。我只想运行它的一个实例,所以我给容器命名。有时我需要修改代码或配置,以便重建映像,然后停止并使用新映像重新启动容器。我一直在做一个docker站,然后是docker站 最近,我尝试将这些合并为一个步骤: docker stop myTask && docker run --rm -d myTask myImage:$VERSION 但是,这在以下情况下失败: docker:来自守护进程的错误响应:冲突。容器名“/myTask”已由

我有一个在docker容器中运行的任务。我只想运行它的一个实例,所以我给容器命名。有时我需要修改代码或配置,以便重建映像,然后停止并使用新映像重新启动容器。我一直在做一个
docker站
,然后是
docker站

最近,我尝试将这些合并为一个步骤:

docker stop myTask &&
    docker run --rm -d myTask myImage:$VERSION
但是,这在以下情况下失败:

docker:来自守护进程的错误响应:冲突。容器名“/myTask”已由容器“49D806E25655A5E6F5309CC5509B54A10B4F0C84E60FAD3985677881C99E9CE”使用。您必须删除(或重命名)该容器才能重用该名称

然后我尝试在那里添加一个
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
此操作仍然失败,出现“容器名称”//myTask“已在使用”错误


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

停止容器与删除它不同。容器在服务器端删除操作(通过
--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

您可以改为使用此命令:

docker rm -f myTask && docker run --rm -d --name myTask myImage:$VERSION

除了等待删除,您还可以使用:

docker stop myTask && docker rename myTask myTaskStopped
docker run --rm -d myTask myImage:$VERSION

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

我在问题中提到停止和删除是不同的。问题中的最后一个代码段在运行
之前执行了
rm
,但仍然失败并出现相同的错误。您的
docker rm
是否抛出任何错误?也许“正在删除”?看起来是这样的,是的。老实说,这看起来很奇怪。我想把它移除,我想等到它被移除。为什么没有办法等待另一个移除完成呢。使用
docker rm-f
代替
docker-stop
确实有效,但它会像
docker-stop
那样执行SIGKILL而不是SIGTERM后跟SIGKILL,这似乎很不幸。@LaurenceGonsalves它不太理想,因此是执行轮询的第二个选项。切换到docker compose
或swarm模式也可以避免这些问题,因为它们依赖于声明目标状态,而不是命令的命令列表。这与我发布的命令不同吗?因此,到目前为止的响应如下(总结):1。使用SIGKILL强制移除(rm-f),而不是优雅地停止2。使用sleep3定期轮询。停止后重命名没有一个是完美的,在我看来,你认为停止前先重命名怎么样?在这种情况下,您将避免争用条件,并保证容器仍然存在于以下所有命令中