【问题标题】:How does one remove a Docker image?如何删除 Docker 映像?
【发布时间】:2013-07-13 23:15:51
【问题描述】:

我在 OS X 10.8.4 (Mountain Lion) 下的 Vagrant 下运行 Docker,每当我尝试删除已保存的图像时,都会出现错误:

$ docker rmi some-image-id
2013/07/15 hh:mm:ss unexpected JSON input

根据rmi 帮助,正确的语法是docker rmi IMAGE [IMAGE...],我不知道该怎么做。

如何删除图片?

$ docker version
Client version: 0.4.8
Server version: 0.4.8
Go version: go1.1

 

$docker info
Containers: 1
Images: 3

有趣的是,当我运行docker ps 时,根本没有容器出现。运行 docker images 会显示四 (4) 个 base 图像和一 (1) 个 node 图像。

【问题讨论】:

  • 你用的是什么版本的docker?你能粘贴'docker version'和'docker info'的输出吗?我刚刚尝试过 master 并且效果很好。
  • 我已经用该信息更新了问题。
  • docker info 显示图片的实际数量,您可以尝试./docker images -a -q | sort | uniq | wc -l 应该是相同的结果(-a 表示所有图片,-q 仅表示 id)。 docker ps 只显示活动容器,您可以使用docker ps -a 列出所有容器
  • 您可以尝试使用-D 选项和客户端启动docker daemon 吗? docker -d -D& ; docker -D rmi <id>。你也可以试试CID=$(docker run -d ubuntu bash); ID=$(docker commit $CID); docker rmi $ID吗?
  • 看看这个拉取请求:github.com/dotcloud/docker/pull/1225

标签: docker


【解决方案1】:

试试docker rmi node。那应该行得通。

查看所有创建的容器就像docker ps -a 一样简单。

要删除所有现有容器(不是图像!)运行docker rm $(docker ps -aq)

【讨论】:

  • 如果您的某些容器仍在运行,您可以运行: docker stop $(docker ps -qa) 停止所有容器。我认为删除正在运行的容器可能不起作用,至少我记得我遇到过这个问题。我可能错了……我检查了手册页,它支持我的假设:“-f, --force=true|false 强制删除正在运行的容器。默认值为 false。”
  • 啊,我不知道“删除所有现有容器”的命令。自己写过:docker ps -a | sed -r 's/^(\w+).*/\1/g' | sed -r 's/^CONTAINER//' | sed -r 's/^(\w+)/docker rm \1/g' | awk 'system($0)' 谢谢!
  • 当您需要使用特定于 shell 的功能来实现基本功能时,您知道命令行选项的设计很糟糕。
  • 要删除所有现有图像,您可以使用 -" docker rmi $(docker images -q)"
  • 使用 windows powershell 删除所有现有容器:docker ps -aq | Foreach-Object { docker stop $_; docker rm $_; }
【解决方案2】:

以下是一些删除docker镜像/容器的方法:

移除单张图片

docker rmi image_name:version/image-id

删除所有图片

docker rmi $(docker images -qf "dangling=true")

杀死容器并移除它们:

docker rm $(docker kill $(docker ps -aq))

注意:将 kill 替换为 stop 以实现正常关机

删除除“my-image”之外的所有图片

使用 grep 删除除 my-imageubuntu 之外的所有内容

docker rmi $(docker images | grep -v 'ubuntu\|my-image' | awk {'print $3'})

(不带awk)

docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image))

【讨论】:

  • 添加:删除“悬空”图像(没有标签的图像):docker rmi $(docker images -qf "dangling=true")
  • 应该是docker rm $(docker kill $(docker ps -a -q))
  • "删除所有除了"没有 awk:docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image))
  • @kolypto "dangling=true" 似乎最终不会删除非悬空容器。再次运行,减去 -f 和悬挂标志以删除其余部分。
  • 只是我,还是最后一个建议(或(没有 awk))没有真正起作用?
【解决方案3】:

删除所有 docker 容器

docker rm $(docker ps -a -q)

删除所有 docker 镜像

docker rmi $(docker images -q)

【讨论】:

  • 删除未标记的图像:docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
  • eq8.eu/blogs/23-spring-cleaning-for-webdevelopers sudo docker rmi -f $(sudo docker images | grep "<none>" | awk "{print \$3}") 然后要删除 2015 年的实时发布标签(例如 live-20150121223),我们可以这样做 sudo docker rmi -f $(sudo docker images | grep live-2015 | awk "{print \$3}")
  • 要强制它,你必须写:docker -f rm $(docker ps -a -q)
【解决方案4】:

使用镜像 ID 从 Docker 中移除镜像:

  1. 获取所有图片的列表

    docker images
    
  2. 标识要删除的图片的图片ID,例如:

    REPOSITORY     TAG     IMAGE ID        CREATED        VIRTUAL SIZE
    kweku360/java  latest  08d3a9b8e166    2 weeks ago         5.733 GB`
    
  3. 最后用图片ID去掉图片(只需要前三位)

    docker rmi 08d
    

【讨论】:

【解决方案5】:
docker rmi  91c95931e552

来自守护进程的错误响应:冲突,无法删除 91c95931e552 因为容器 76068d66b290 正在使用它,使用 -f 强制 FATA[0000] 错误:无法删除一张或多张图片

查找容器 ID,

# docker ps -a

# docker rm  daf644660736 

【讨论】:

  • 这是问题的答案吗?
  • 为什么是daf644660736?这与以前的任何一个有什么关系?
【解决方案6】:

这是一个用于删除标记(命名)图像及其容器的 shell 脚本。 另存为 docker-rmi 并使用 'docker-rmi my-image-name' 运行

#!/bin/bash

IMAGE=$1

if [ "$IMAGE" == "" ] ; then
  echo "Missing image argument"
  exit 2
fi

docker ps -qa -f "ancestor=$IMAGE" | xargs docker rm
docker rmi $IMAGE

【讨论】:

  • 您需要xargs -r 才能使其在没有匹配容器的情况下工作。
【解决方案7】:

docker rm container_name

docker rmi image_name

docker help

rm 移除一个或多个容器

rmi 删除一张或多张图片

【讨论】:

  • 谢谢,但是这个问题已经有几个答案了,还有一个选择的答案,差不多 3 年前就解决了这个问题。
【解决方案8】:

更新,正如 VonC 在 How to remove old Docker containers 中评论的那样。

使用 Docker 1.13(2016 年第四季度),您现在拥有:

docker system prune 将删除所有未使用的数据(即,依次为:容器停止、没有容器的卷和没有容器的图像)。

请参阅 PR 26108commit 86de7c0,它们引入了一些新命令,以帮助可视化 Docker 守护程序数据在磁盘上占用了多少空间,并允许轻松清理“不需要”的多余空间。

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

【讨论】:

  • 感谢您的详尽回答,但这并不能直接回答原始问题(已经回答,并且其最佳答案仍然相关)。
  • 我同意。然而,由于这个问题的标题非常笼统,这已经成为一个参考问题,所以我认为对机制进行了更新。
【解决方案9】:

删除容器

  1. 移除特定容器

    docker rm CONTAINER_ID CONTAINER_ID
    
    • 对于单张图片

      docker rm  70c0e19168cf
      
    • 多张图片

      docker rm  70c0e19168cf c2ce80b62174
      
  2. 移除退出的容器

    docker ps -a -f status=exited
    
  3. 移除所有容器

    docker ps -q -a | xargs docker rm
    


删除图片

docker rmi IMAGE_ID
  1. 移除特定图片

    • 单张图片

      docker rmi ubuntu
      
    • 多张图片

      docker rmi ubuntu alpine
      
  2. 删除悬空图像
    悬空图像是与任何标记图像无关的层,因为 Docker 图像由多个图像组成。 em>

    docker rmi -f $(docker images -f dangling=true -q)
    
  3. 删除所有 Docker 映像

    docker rmi -f $(docker images -a -q)
    

删除卷

要列出卷,请运行 docker volume ls

  1. 删除特定卷

    docker volume rm VOLUME_NAME
    
  2. 移除悬空卷

    docker volume rm $(docker volume ls -f dangling=true -q)
    
  3. 删除容器及其卷

    docker rm -v CONTAINER_NAME
    

【讨论】:

  • 为什么要加倍CONTAINER_ID
【解决方案10】:

如果您想自动/定期清理退出的容器并删除正在运行的容器未使用的映像和卷,您可以下载映像 meltwater/docker-cleanup

我在生产中使用它,因为我们每天在多台服务器上部署多次,我不想去每台服务器进行清理(那会很痛苦)。

只要运行:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

它将每 30 分钟运行一次(或者无论您使用 DELAY_TIME=1800 选项设置多长时间)并清理退出的容器和图像。

更多详情:https://github.com/meltwater/docker-cleanup/blob/master/README.md

【讨论】:

    【解决方案11】:

    对我来说,以下工作正常:

    > docker images
    REPOSITORY   TAG           IMAGE ID          CREATED             SIZE
    debian       jessie        86baf4e8cde9      3 weeks ago         123MB
    ubuntu       yakkety       7d3f705d307c      3 weeks ago         107MB
    alpine       3.5           074d602a59d7      7 weeks ago         3.99MB
    

    然后继续通过运行以下命令删除图像:

    > docker rmi debian:jessie
    > docker rmi ubuntu:yakkety
    > docker rmi alipine:3.5
    

    【讨论】:

      【解决方案12】:

      首先,我们必须停止并删除与我们要删除的 Docker 映像关联的 Docker 容器。

      所以,首先

      • docker stop container-id - 停止正在运行的容器
      • docker rm container-id - 删除/移除容器

      那么,

      • docker rmi image-id - 删除/移除图片

      【讨论】:

        【解决方案13】:

        删除所有使用

        第 1 步:杀死所有容器

        for i in `sudo docker ps -a | awk '{ print $1 }'`; do sudo docker kill $i ; done
        

        第 2 步:先 RM 他们

        for i in `sudo docker ps -a | awk '{ print $1 }'`; do sudo docker rm $i ; done
        

        第三步:强制删除图片

        for i in `sudo docker images | awk '{ print $3}'`; do  sudo docker rmi --force $i ; done
        

        使用第 1 步,以防您收到错误提示由于子依赖项而无法删除它

        【讨论】:

          【解决方案14】:

          对于 1.13 及更高版本:

          docker image rm [OPTIONS] IMAGE [IMAGE...]
          

          比较:

          [OPTIONS] 好像没有区别。

          --force , -f        Force removal of the image
          --no-prune          Do not delete untagged parents
          

          发件人:Introducing Docker 1.13

          CLI 重组

          在 Docker 1.13 中,我们将每个命令重新组合到与之交互的逻辑对象下。例如容器的liststart 现在是docker container 的子命令,而historydocker image 的子命令。

          这些更改让我们可以清理 Docker CLI 语法、改进帮助文本并使 Docker 更易于使用。 旧的命令语法仍受支持,但我们鼓励大家采用新的语法

          【讨论】:

            【解决方案15】:

            列出图片:

            ahanjura@ubuntu:~$ sudo docker images
            

            存储库标签图像 ID 创建大小 88282f8eda00 19 秒前 308.5 MB 13e5d3d682f4 19 小时前 663 MB busybox2 最新 05fe66bb1144 20 小时前 1.129 MB ubuntu 16.04 00fd29ccc6f1 5 天前 110.5 MB ubuntu 14.04 67759a80360c 5 天前 221.4 MB python 2.7 9e92c8430ba0 7 天前 680.7 MB busybox 最新 6ad733544a63 6 周前 1.129 MB ubuntu 16.10 7d3f705d307c 5 个月前 106.7 MB

            删除图片:

            ahanjura@ubuntu:~$ sudo docker rmi 88282f8eda00
            

            已删除:sha256:88282f8eda0036f85b5652c44d158308c6f86895ef1345dfa788318e6ba31194 已删除:sha256:4f211a991fb392cd794bc9ad8833149cd9400c5955958c4017b1e2dc415e25e9 已删除:sha256:8cc6917ac7f0dcb74969ae7958fe80b4a4ea7b3223fc888dfe1aef42f43df6f8 已删除:sha256:b74a8932cff5e61c3fd2cc39de3c0989bdfd5c2e5f72b8f99f2807595f8ece43

            ahanjura@ubuntu:~$ sudo docker rmi 13e5d3d682f4
            

            来自守护程序的错误响应:冲突:无法删除 13e5d3d682f4(必须强制)- 已停止的容器 5593e25eb638 正在使用图像

            强制删除:

            ahanjura@ubuntu:~$ sudo docker rmi -f 13e5d3d682f4
            

            已删除:sha256:13e5d3d682f4de973780b35a3393c46eb314ef3db45d3ae83baf2dd9d702747e 已删除:sha256:3ad9381c7041c03768ccd855ec86caa6bc0244223f10b0465c4898bdb21dc378 已删除:sha256:5ccb917bce7bc8d3748eccf677d7b60dd101ed3e7fd2aedebd521735276606af 已删除:sha256:18356d19b91f0abcc04496729c9a4c49e695dbfe3f0bb1c595f30a7d4d264ebf

            【讨论】:

              【解决方案16】:

              图片:

              1. 列出图像

                泊坞窗图片

              2. 删除一张图片

                docker rmi image_name

              3. 强制删除一张图片

                docker rmi -f image_name

              容器:

              1. 列出所有容器

                docker ps -a

              2. 移除一个容器

                docker rm container_id

              3. 强制删除一个容器

                docker rm -f container_id

              【讨论】:

                【解决方案17】:

                Docker 提供了一些命令来删除images

                显示/删除Images:

                docker images
                docker images -a # All images
                docker images --no-trunc # List the full length image IDs
                
                docker images --filter "dangling=true" // Show unstage images
                docker rmi $(docker images -f "dangling=true" -q) # Remove on unstages images
                
                docker rmi <REPOSITORY> or <Image ID> # Remove a single image
                
                docker image prune # Interactively remove dangling images
                docker image prune -a # Remove all images
                
                or 
                
                docker rmi -f $(sudo docker images -a -q)
                

                此外,您还可以使用filter 参数来删除图像集 一次:

                例子:

                $docker images --filter "before=<hello-world>" // It will all images before hello-world
                
                $docker images --filter "since=<hello-world>" // It will all images since hello-world
                

                所以你可以像这样删除过滤器图像:

                docker rmi $(docker images --filter "since=<hello-world>")
                docker rmi $(docker images --filter "before=<hello-world>")
                

                【讨论】:

                  【解决方案18】:

                  就我而言,问题是我有两个同名的图像 解决办法是在名字或者id后面加标签

                  sudo docker rmi <NAME>:<TAG>
                  

                  例如:

                  sudo docker rmi php:7.0.4-fpm
                  

                  【讨论】:

                    【解决方案19】:

                    为什么没有人提到docker-compose!我才用了一个星期,没有它我活不下去。你所需要的只是编写一个只需要几分钟学习的 yml,然后你就可以开始了。它可以启动镜像、容器(在所谓的服务中需要这些)并让您查看日志,就像您使用 docker 本机命令一样。试试看:

                    docker-compose up -d
                    docker-compose down --rmi 'local'
                    

                    在使用 docker-compose 之前,我编写了自己的 shell 脚本,然后我必须在需要时自定义脚本,尤其是在应用程序架构发生变化时。现在我不必再这样做了,感谢 docker-compose。

                    【讨论】:

                    • docker-compose 是一种编排工具,通常不适用于简单的项目。在这个问题的上下文中,一个独立的docker 解决方案(不需要使用经常finnicky docker-compose.yml 配置)是更可取的。此外,这里已经有很多、很多很好的答案了。
                    • @Jules 没有人提到 docker-compose 并不意味着它们是错误的答案,也不意味着这也是一个无助的答案。 Docker 原生命令还不错,但很乏味,每次都需要大量输入。 “一个很好,两个太多了”。
                    猜你喜欢
                    • 1970-01-01
                    • 2017-10-27
                    • 2021-02-07
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-02-19
                    • 2017-10-16
                    • 2022-12-26
                    • 2018-05-25
                    相关资源
                    最近更新 更多