如何删除 Docker 映像?

Posted

技术标签:

【中文标题】如何删除 Docker 映像?【英文标题】:How does one remove a Docker image? 【发布时间】: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 【参考方案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 中移除镜像:

    获取所有图片的列表

    docker images
    

    标识要删除的图片的图片ID,例如:

    REPOSITORY     TAG     IMAGE ID        CREATED        VIRTUAL SIZE
    kweku360/java  latest  08d3a9b8e166    2 weeks ago         5.733 GB`
    

    最后用图片ID去掉图片(只需要前三位)

    docker rmi 08d
    

【讨论】:

第一个需要停止容器并移除它,参考***.com/questions/21398087/…【参考方案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 26108 和 commit 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】:

删除容器

    移除特定容器

    docker rm CONTAINER_ID CONTAINER_ID
    

    对于单张图片

    docker rm  70c0e19168cf
    

    多张图片

    docker rm  70c0e19168cf c2ce80b62174
    

    移除退出的容器

    docker ps -a -f status=exited
    

    移除所有容器

    docker ps -q -a | xargs docker rm
    


删除图片

docker rmi IMAGE_ID

    移除特定图片

    单张图片

    docker rmi ubuntu
    

    多张图片

    docker rmi ubuntu alpine
    

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

    docker rmi -f $(docker images -f dangling=true -q)
    

    删除所有 Docker 映像

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

删除卷

要列出卷,请运行 docker volume ls

    删除特定卷

    docker volume rm VOLUME_NAME
    

    移除悬空卷

    docker volume rm $(docker volume ls -f dangling=true -q)
    

    删除容器及其卷

    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...]

比较:

docker image rm 的documention 和 docker rmi 的documentation,

[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】:

图片:

    列出图像

    泊坞窗图片

    删除一张图片

    docker rmi image_name

    强制删除一张图片

    docker rmi -f image_name

容器:

    列出所有容器

    docker ps -a

    移除一个容器

    docker rm container_id

    强制删除一个容器

    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 原生命令还不错,但很乏味,每次都需要大量输入。 “一个很好,两个太多了”。

以上是关于如何删除 Docker 映像?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过命令行从docker hub删除docker镜像?

如何删除旧的和未使用的 Docker 镜像

如何在 kubernetes 中使用 yaml 文件删除和重新创建 pod

sh Docker容器/映像上的批处理操作的基本功能(加载,保存,终止,删除)

如何使用 googleapis Artifacts API 以编程方式查找和删除通过 Google Cloud Build 构建的容器映像?

从 azureml studio 中删除环境