如何删除 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-image
和 ubuntu
之外的所有内容
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 中,我们将每个命令重新组合到与之交互的逻辑对象下。例如容器的
list
和start
现在是docker container
的子命令,而history
是docker 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 映像?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 kubernetes 中使用 yaml 文件删除和重新创建 pod
sh Docker容器/映像上的批处理操作的基本功能(加载,保存,终止,删除)
如何使用 googleapis Artifacts API 以编程方式查找和删除通过 Google Cloud Build 构建的容器映像?