【问题标题】:Docker rmi - Is it okay to use --force?Docker rmi - 可以使用 --force 吗?
【发布时间】:2018-04-11 05:33:02
【问题描述】:

我对 Docker 比较陌生,我最近开始运行 ubuntu 容器,几天后优雅地停止了它(我没有看到它使用“docker ps”)。当我尝试使用

删除 ubuntu 图像时
docker rmi ubuntu

我收到以下错误:

来自守护进程的错误响应:冲突:无法删除存储库引用“ubuntu”(必须强制)-容器 65c315b169b8 正在使用其引用的映像 747cb2d 60bbe

我可以使用“--force”强制删除图像吗,

docker rmi ubuntu --force

或者有没有更优雅/更安全的方式来做到这一点?

【问题讨论】:

    标签: docker


    【解决方案1】:

    默认情况下docker ps 只会显示正在运行的容器。您可以使用docker ps --all 显示已停止的。

    然后您可以先使用docker rm <CONTAINER_ID> 删除容器

    如果您想删除所有容器,无论是否停止,您都可以在 bash 提示符下使用

    $ docker rm $(docker ps --all -q)
    

    -q 开关只返回 ID

    【讨论】:

    • 谢谢!使用 docker rmi ubuntu --force 还可以吗?
    • TBH 我不知道这个问题的确切答案。我和你一样,除非绝对必要,否则不喜欢使用武力。这个答案更详细地介绍了强制删除:stackoverflow.com/questions/21398087/…
    【解决方案2】:

    由于其他人似乎不愿意测试但愿意传教,我决定自己测试一下:

    • 我下载了一张新图片,所以我知道它没有被使用
    • 我运行了一个新容器
    • 我使用docker rmi --force <name>删除了图像
    • 图片只是未标记,并未删除
    • 我未能使用 docker rmi --force <ID> 删除图像,因为 docker 被“运行容器 922a12161de6 正在使用图像”斥责

    所以结果是:

    • 当您命名该映像时,它会被取消标记,但 Docker(至少是我使用的版本,19.03.5 build 633a0ea)足够聪明,不会在使用层时实际删除它们。
    • 因此,容器继续正常运行,因为层仍然存在,它们只是未标记。您可以docker rmi <ID>docker images prune(没有-a 它只会删除“悬空”图像,即不包括未使用的图像)。

    因此答案是“是的,但如果这是您所希望的,它不会删除容器”,但现在您知道原因了

    但是,我对大多数其他答案告诉您找到正在运行的容器的方式并不满意,因为它们似乎在说“列出所有图像”——为什么?您正在尝试删除特定图像。

    Stefano 的回答更准确,但这里有一些调整:

    imageName=ubuntu
    containerIds=$(docker ps -a | grep "$imageName" | awk '{ print $1 }')
    docker stop $containerIds
    docker rm $containerIds
    docker rmi "$imageName"
    

    基本上,我为图​​像名称添加了一个变量和一个停止步骤。

    【讨论】:

      【解决方案3】:

      Docker 不会将映像数据复制到每个容器,所有运行映像的容器都有一个指向文件系统该部分的只读指针(每个容器都有自己的本地 RW 层)。因此,如果您在容器使用镜像时删除镜像,您将破坏容器并覆盖它所依赖的文件系统。

      相反,只需先移除容器即可。它可能会退出而不是运行,因此您可以通过docker ps -a | grep $image_id 获取运行该特定图像 ID 的容器的快速列表,但首选列表将包括任何后代:

      docker rm $(docker ps -aq --filter "ancestor=747cb2d60bbe")
      

      然后你就可以运行你的docker image rm(或docker rmi)命令了。


      更新:如果您强制删除图像,docker 所做的就是取消标记它。镜像层仍然存在于文件系统中,直到容器被删除,然后您可以删除这些镜像层。例如:

      / $ docker run -d --rm busybox tail -f /dev/null
      dac68c445371feab453ba3e3fc80efee52043f6b177fd0a71d0b55b38753f2cf
      
      / $ docker image rm busybox
      Error response from daemon: conflict: unable to remove repository reference "busybox" (must force) - container dac68c445371 is using its referenced image 020584afccce
      
      / $ docker image rm --force busybox
      Untagged: busybox:latest
      Untagged: busybox@sha256:1303dbf110c57f3edf68d9f5a16c082ec06c4cf7604831669faf2c712260b5a0
      
      / $ docker image ls -a
      REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
      <none>              <none>              020584afccce        2 weeks ago         1.22MB
      

      即使删除容器后,图层仍然存在:

      / $ docker ps -l
      CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS               NAMES
      dac68c445371        020584afccce        "tail -f /dev/null"   52 seconds ago      Up 50 seconds                           brave_yalow
      
      / $ docker stop dac
      dac
      
      / $ docker image ls -a
      REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
      <none>              <none>              020584afccce        2 weeks ago         1.22MB
      

      但在容器被移除后,您可以清理图层:

      / $ docker image prune
      WARNING! This will remove all dangling images.
      Are you sure you want to continue? [y/N] y
      Deleted Images:
      deleted: sha256:020584afccce44678ec82676db80f68d50ea5c766b6e9d9601f7b5fc86dfb96d
      deleted: sha256:1da8e4c8d30765bea127dc2f11a17bc723b59480f4ab5292edb00eb8eb1d96b1
      
      Total reclaimed space: 1.22MB
      

      【讨论】:

      • 很好的答案,实际上概述了为什么需要--force
      【解决方案4】:

      如果你想优雅地做,你应该看看是否有其他使用ubuntu的图像。无论如何,在您的情况下,您有一个与该图像相关的容器。

      这是一个关于如何获取此内容的示例脚本:

      containerId=$( docker container ls -a | grep ubuntu | awk '{ print $1 }' )
      docker container rm $containerId
      docker image rm ubuntu
      

      【讨论】:

      • 一个正在运行的容器,虽然它的镜像被删除了,还能正常工作吗?
      • 好吧,如果你强行删除基础镜像,你会删除所有关联的镜像
      【解决方案5】:

      删除所有容器和所有图像以赢得一些空间!

      $ docker rm $(docker ps -all -q)
      $ docker rmi $(docker image ls -q)
      

      【讨论】:

      • 没有回答是否可以使用强制删除带有依赖项的图像的问题。
      【解决方案6】:

      如果您想删除所有未使用的图像,您可以尝试使用 docker 图像提供的 prune 选项。

      https://docs.docker.com/engine/reference/commandline/image_prune/#usage

      docker image prune -a

      【讨论】:

        【解决方案7】:

        什么时候删除 docker 镜像

        1. 当磁盘空间不足并且
        2. 他们肯定知道他们不需要映像,或者他们以后需要时是否可以从 Internet/docker 注册表轻松下载

        因此,如果您可以访问互联网并且遇到磁盘空间问题,则可以强制删除图像

        为什么会出现错误:

        Docker 认为有一个容器(当前已停止)正在使用此映像。如果您删除这个停止的 docker,“docker rmi”将无需强制运行

        【讨论】:

          【解决方案8】:

          这些是 docker 查看和删除内容的基本有用命令。

          1. 查看所有 docker 镜像:docker image ls

          2. 查看 docker 容器:docker ps

          3. 停止 docker 容器:docker stop &lt;container name&gt;

          4. 移除 docker 容器:docker rm &lt;container name&gt;

          5. 移除 docker 镜像:docker rmi image &lt;image name&gt;

          6. 删除当前镜像以外的 Docker 镜像 - docker image prune -a

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-17
            • 2018-12-26
            • 1970-01-01
            相关资源
            最近更新 更多