(原答案见下文)
2016 年 9 月更新:码头工人1.13:PR 26108 https://github.com/docker/docker/pull/26108 and 提交 86de7c0 https://github.com/docker/docker/commit/86de7c000f5d854051369754ad1769194e8dd5e1引入一些新命令来帮助可视化 docker 守护进程数据在磁盘上占用的空间,并允许轻松清理“不需要的”多余空间。
docker system prune https://docs.docker.com/engine/reference/commandline/system_prune/将删除所有悬空数据(容器、网络和图像)。您可以使用以下命令删除所有未使用的卷--volumes
选项并删除所有未使用的图像(不仅仅是悬空的图像)-a
option.
您还拥有:
- docker container prune https://docs.docker.com/engine/reference/commandline/container_prune/
- docker image prune https://docs.docker.com/engine/reference/commandline/image_prune/
- docker network prune https://docs.docker.com/engine/reference/commandline/network_prune/
- docker volume prune https://docs.docker.com/engine/reference/commandline/volume_prune/
For unused图像、使用docker image prune -a
(用于去除悬空and未使用的图像)。
警告: 'unused' 表示“图像未被任何容器引用”:使用前要小心-a
.
如图所示A L https://stackoverflow.com/users/1207596/a-l's answer https://stackoverflow.com/a/50405599/6309, docker system prune --all
将删除所有unused图像不仅仅是悬挂的图像......这可能有点太多了。
组合docker xxx prune
与--filter option https://docs.docker.com/engine/reference/commandline/system_prune/#filtering可能是限制修剪的好方法(docker SDK API 最低版本为 1.28,因此 docker 17.04+ https://docs.docker.com/develop/sdk/#api-version-matrix)
目前支持的过滤器有:
-
until (<timestamp>)
- 仅删除给定时间戳之前创建的容器、图像和网络
-
label
(label=<key>
, label=<key>=<value>
, label!=<key>
, or label!=<key>=<value>
) - 仅使用 (或without, 以防万一label!=...
使用)指定的标签。
See "修剪图像 https://docs.docker.com/config/pruning/#prune-images” 为例。
警告:没有“预览”或“--dry-run
“ 那些的选项docker xxx prune
命令。
这是要求的moby/moby问题 30623 https://github.com/moby/moby/issues/30623自 2017 年以来,但似乎实施起来很棘手 https://github.com/moby/moby/issues/30623#issuecomment-1216395952(2022 年 8 月)
由于各种原因,对将要修剪的内容进行更具代表性的概述将相当复杂;
-
竞争条件(可以通过记录限制来解决);
容器/图像/卷/网络在使用“试运行”时可能尚未使用,但可能在执行实际修剪时正在使用(反之亦然),因此试运行将始终是一个将修剪的内容的“近似值”。
- 更困难的部分是由于对象(容器、图像、网络等)如何相互依赖.
例如,如果不再引用某个图像(不再有标签,不再有容器使用它),则可以删除该图像;这就是 docker system prune 按特定顺序删除对象的原因(首先删除所有未使用的容器,然后删除未使用的映像)。
为了复制“空运行”的相同流程,需要临时构建所有对象的表示以及基于该对象的引用位置(基本上;复制所有引用计数器,然后从该“中删除引用”阴影”表示)。
- 最后;与正在开展的整合工作
containerd
快照器(图像和图层存储),事情可能会发生更多变化;
例如,图像现在可以是多架构的,并且(待讨论)“修剪”可以从图像中删除未使用的变体(架构)以清理空间,这为计算“可以删除什么”带来了另一个维度。
原始答案(2016 年 9 月)
我通常这样做:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
我有一个 [别名用于删除那些悬空 图片 https://github.com/docker/docker/blob/634a848b8e3bdd8aed834559f3b2e0dfc7f5ae3a/man/docker-images.1.md#options: drmi
]13 https://github.com/docker/docker/blob/634a848b8e3bdd8aed834559f3b2e0dfc7f5ae3a/man/docker-images.1.md#options
The dangling=true
过滤器找到未使用的图像
这样,标记图像不再引用的任何中间图像都会被删除。
我也一样first for 退出的进程(容器) https://github.com/VonC/b2d/blob/b010ab51974ac7de6162cdcbff795d7b9e84fd67/.bash_aliases#L21
alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'
As haridsv https://stackoverflow.com/users/95750/haridsv指出在评论中 https://stackoverflow.com/questions/32723111/how-to-remove-old-and-unused-docker-images/32723127#comment63457575_32723127:
从技术上来说,您应该先清理容器,然后再清理图像,因为这会捕获更多悬空图像并减少错误.
杰西·弗雷泽 (jfrazelle) https://github.com/jfrazelle有.bashrc 函数 https://github.com/jfrazelle/dotfiles/blob/a7fd3df6ab423e6dd04f27727f653753453db837/.dockerfunc#L8-L11:
dcleanup(){
docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
}
要删除旧图像,而不仅仅是“未引用的悬挂”图像,您可以考虑docker-gc https://github.com/spotify/docker-gc:
一个简单的 Docker 容器和图像垃圾收集脚本。
- 一个多小时前退出的容器将被删除。
- 之后不属于任何剩余容器的图像将被删除。