【问题标题】:docker restart container failed: "already in use", but there's no more docker imagedocker restart 容器失败:“已经在使用”,但没有更多的 docker 镜像
【发布时间】:2020-06-03 11:24:37
【问题描述】:

我首先得到了我的 nginx docker 镜像:

docker pull nginx

然后我开始了:

docker run -d -p 80:80 --name webserver nginx

然后我停止了:

docker stop webserver

然后我尝试重新启动它:

$docker run -d -p 80:80 --name webserver nginx
docker: Error response from daemon: Conflict. The container name "/webserver" is already in use by container 036a0bcd196c5b23431dcd9876cac62082063bf62a492145dd8a55141f4dfd74. You have to remove (or rename) that container to be able to reuse that name..
See 'docker run --help'.

嗯,这是一个错误。但实际上现在容器列表中什么都没有:

docker container list
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

为什么我重启 nginx 镜像失败了?如何解决?

【问题讨论】:

    标签: list nginx docker containers


    【解决方案1】:

    因为

    • 您使用了--name 开关。
    • 容器已停止且未移除

    你发现它停止了

    docker ps -a
    

    您可以使用以下命令简单地启动它:

    docker start webserver
    

    编辑:替代方案 如果你想每次都用下面的命令启动容器,

    docker run -d -p 80:80 --name webserver nginx
    

    然后使用以下方法之一:

    方法一:使用--rm开关,即容器一停止就自动销毁

    docker run -d -p 80:80 --rm --name webserver nginx
    

    方法 2:在停止容器后显式删除它,然后再启动您当前使用的命令。

    docker stop <container name>
    docker rm <container name>
    

    【讨论】:

    • docker:来自守护进程的错误响应:驱动程序在端点网络服务器上编程外部连接失败
    • --rm 是有史以来最有用的 docker run 标志!谢谢!
    【解决方案2】:

    正如错误所说。

    您必须删除(或重命名)该容器才能重用该名称

    这给你两个选择。

    • 您可以使用命令删除使用名称“webserver”的容器

      码头工人 rm 036a0bcd196c5b23431dcd9876cac62082063bf62a492145dd8a55141f4dfd74

    然后重试。

    • 或者您可以在运行命令期间使用不同的名称。不建议这样做,因为您不再需要该 docker。

    最好删除不需要的 docker 并重用名称。

    【讨论】:

      【解决方案3】:

      虽然很好的答案是正确的,但它们实际上并没有解决我面临的问题。

      如何:

      安全地自动启动 命名 docker 容器,无论其先前的状态如何

      解决方案是使用附加检查包装docker run 命令,然后根据结果执行runstop + run(有效地使用新图像重新启动)。

      这实现了我的两个目标:

      • 避免错误
      • 允许我定期更新映像(比如新版本)并安全重启
      #!/bin/bash
      # Adapt the following 3 parameters to your specific case
      NAME=myname
      IMAGE=myimage
      RUN_OPTIONS='-d -p 8080:80'
      
      ContainerID="$(docker ps --filter name="$NAME" -q)"
      
      if [[ ! -z "$ContainerID" ]]; then
          echo "$NAME already running as container $ContainerID: stopping ..."
          docker stop "$ContainerID"
      fi
      echo "Starting $NAME ..."
      exec docker run --rm --name "$NAME" $RUN_OPTIONS "$IMAGE"
      

      现在我可以以幂等方式运行(或停止 + 启动,如果已经运行)$NAME docker 容器,而不必担心这种可能的失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-14
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多