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

2023-12-26

当Docker长时间运行时,系统中会存在大量的镜像。如何一次性安全删除所有未使用的 Docker 镜像以释放存储空间?

此外,我还想删除几个月前提取的图像,这些图像具有正确的TAG.

因此,我不仅仅要求删除未标记的图像。我正在寻找一种方法来删除一般未使用的图像,其中包括未标记的图像和其他图像,例如几个月前正确提取的图像TAG.


(原答案见下文)


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 容器和图像垃圾收集脚本。

  • 一个多小时前退出的容器将被删除。
  • 之后不属于任何剩余容器的图像将被删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何删除旧的和未使用的 Docker 镜像 的相关文章

随机推荐