Moby: 实施“干净”命令

创建于 2013-06-19  ·  103评论  ·  资料来源: moby/moby

有一个清理 docker 的命令会很好:

  • 未标记的图像
  • 超过 1 周(或 24 小时?)

这可以通过新的顶级命令“docker clean”或“docker rm”和“docker rmi”的选项来完成。

我认为这个服务器端比客户端更好。

最有用的评论

自从这个线程开始提出许多不需要脚本批处理的额外建议以来,已经过去 2 年多了,比如docker rm --stoppeddocker rmi --untagged等。因为我仍然收到关于这个的通知,让我们用混音经典来庆祝吧。

You have ten seconds

所有103条评论

很难找到“干净”的通用定义。 如果我有
运行数月或数年的生产数据库? 应该清洗吗? :)

2013 年 6 月 18 日,星期二,下午 5:04,Guillaume J. Charmes <
[email protected]> 写道:

有一个清理 docker 的命令会很好:

  • 未标记的图像
  • 超过 1 周(或 24 小时?)

这可以通过新的顶级命令“docker clean”或通过
'docker rm' 和 'docker rmi' 的选项。

我认为这个服务器端比客户端更好。


直接回复本邮件或在Gi tHub上查看
.

同意,这就是为什么为 clean 命令采用 2 个维度是有意义的。 自上次开始以来的时间量 + 创建日期。

例如,清理所有在 30 天前创建且 1 周未启动的容器。

注意:运行持续时间也是一个很好的提示! (很有可能,那短暂的
容器可以扔掉。)

我最喜欢的方法是改进“docker images”和“docker ps”
具有高级过滤功能,然后可以轻松地将其通过管道传输到“docker”中
rm' 和 'docker rmi'。 更多 unix-y :)

2013 年 6 月 18 日,星期二,下午 6:20,Jérôme Petazzoni
通知@github.com写道

注意:运行持续时间也是一个很好的提示! (很有可能,那短暂的
容器可以扔掉。)


直接回复本邮件或在Gi tHub上查看
.

这似乎是每个人都希望拥有自己风格的那种功能。 也许后续的功能是创建一个相当于 git 别名的东西,所以如果有人想要一个docker clean他们可以用自己的方式来做,现在就开始做 unix-y 过滤器和管道的东西。

我的建议如下。

A) 允许容器标记。 也允许(可能是唯一的)描述(例如“用户信息数据库”),这将使容器列表方式更具可读性和信息量。
B) 然后实现一个选项,例如docker rm -a ,这将删除所有未标记的容器,也许docker rm -a --hard将删除所有容器。

在我看来,除了标准 unix 命令已经提供的可能性之外,这将提供很多价值。

+1 到docker clean 。 那太好了, docker ps -a不会在合理的(10 分钟以上)时间内返回。

它只会变得更糟。

嘿尼克,有了最新的更新 (0.4.6),'docker ps -a' 应该很快
再次。 减慢速度的是计算每个容器的大小
fly,我们将其移至可选标志 (-s)。

2013 年 6 月 23 日星期日晚上 9:38,Nick Stinemates
通知@github.com写道

+1 到码头清洁。 那太好了,docker ps -a 没有返回
现在在合理的(10+ 分钟)时间内。

它只会变得更糟。


直接回复本邮件或在Gi tHub上查看
.

确认的。 升级帮助很大!

keeb@li253-7:~$ docker ps -a | wc -l
502

我对干净命令的概念持不同意见。 说它会很棒的评论是真的,那些暗示清洁是每个人都想要自己的味道的评论是真的。

看起来这与构建垃圾收集器有很多相似之处......但是对于什么构成强引用没有明确的定义,因为docker命令可能想要引用一个在任意大距离之前结束的容器时间或在随后的容器运行中。

就像我之前说的:我想看到的是 _querying_ 的改进方式
图像和容器。 可用于通过管道进入“docker”进行移除
rm',但也用于其他事情。

在 2013 年 6 月 26 日星期三下午 3:55,E​​ric Myhre通知@ github.com 写道:

我对干净命令的概念持不同意见。 评论
说它会很棒是真的,正如那些暗示的那样
干净是每个人都想要自己的味道的东西。

好像这和建造垃圾有很多相似之处
收藏家……但是对于什么是强大的,没有明确的定义
参考,因为 docker 命令可能想要引用一个
在任意远的距离之前结束的容器
后续容器运行。


直接回复本邮件或在Gi tHub上查看
.

请看#1077

我认为它提供了一种在不干扰其他任何事物的情况下处理临时事物的好方法。

怎么样: docker ps -a | cut -c-12 | xargs docker rm

@SeyZ这确实有效,但它只会删除容器和所有容器。
顺便说一句,你也可以使用docker rm docker ps -a -q``

我投票实施一个适用于图像和容器的“干净”命令。 Docker 使用了大量磁盘空间并留下了很多东西。 在磁盘空间有限的环境中,无需借助神秘的 bash 脚本来清除 docker run 和 docker build 中的大量遗留内容。

我不得不求助于以下 bash 脚本来清理容器:

docker ps -a | cut -c-12 | xargs docker rm

这是清理图像:

images=`sudo find /var/lib/docker/graph/ -maxdepth 1 -type d -printf "%f "`
docker rmi $images

我的用例:

Build a docker file.
Push it to a private repository
Pull the docker to a production box
Run it
Hook it up into nginx
Kill the old docker.

推送盒和应用服务器上的这一系列步骤每次在构建盒和应用服务器上完成都会消耗 1/2 到 2 g。 在 20GB 的机器上,没有空间。

它似乎应该成为命令大炮的一部分。它应该简单、明显且有据可查。

docker clean 图片
码头清洁容器

或者

docker rm -a [--hard]
docker rmi -a [--hard]

也许我在管理容器和图像方面遗漏了一些关键的东西,我可以做些什么来使其更易于管理?

@robblovell

你现在可以这样做:

删除所有容器

docker rm `docker ps -a -q`

**delete all images**
docker rmi `docker images -q`

我认为关键是 docker 似乎留下了很多东西,包括图像和容器。 我不知道硬盘上的所有空间都去哪儿了,直到我发现了一些神奇的记录和未记录的东西。 我认为真正重新考虑图像构建缓存和整个图形的事情很重要。 当我构建一个容器时,我应该能够将它与所有其他关联断开连接,以便它独立于所有这些关联。 我应该能够删除缓存包,而不必担心我刚刚创建的图像被搞砸了。 我还应该能够杀死一个容器并让它从磁盘中完全消失。

与此问题相关的旁白:
标记某些内容以将其移动到另一个注册表作为解决方案是不可接受的,它既不直观,又会在注册表之间造成不必要的耦合。 我的私人回购、公共回购和本地回购不应该相互关联。 我应该能够执行“docker push [image name] [registry_url]”并将我的独立图像推送到那里,没有行李,没有来自我推送的地方的连接。

我只是想将我作为新用户的体验联系起来。 不直观的是注册表和存储库之间的区别以及这样一个事实,即当我构建或运行某些东西时,如果您不断地构建和删除图像,以及运行和终止容器,就会有很多包袱。

例如:这是一个我删除内容的会话,正如您所看到的,从剩余的 docker 容器中删除了大约 23 GB 的空间:

从一个完整的磁盘....

docker ps -a | 切-c-12 | xargs 码头工人

错误:没有这样的容器:ID

错误:无法删除正在运行的容器,请先停止它

d46a31743a91
c6ba4a162585
...
此处删除了 1036 行...
...
75b387dabb63
2627552d6c84

df -h

已使用的文件系统大小 Avail Use% Mounted on
/dev/xvda1 63G 40G 20G 67% /

我们正在讨论解决此问题的 2 项改进,这些改进在 0.6.6 中部分实现,并将在 0.7 分支中继续:

  • 图像和容器的“图形”正在统一,因此您可以跨所有容器和图像跟踪任何容器或图像的沿袭。
  • 默认情况下,容器和图像都将被命名,可能有多个名称。

在这个系统中,名称可用于引用计数和垃圾收集。 如果容器或图像的名称下降到 0,则可以安全地将其删除。 这将处理构建后的剩余容器或图像、临时容器等。

这意味着我们不需要“干净”命令。 因此我关闭这个问题:)

对于那些想要清除停止的 docker 容器,保留正在运行的容器,并希望在没有错误的情况下零退出代码的人,请使用以下内容。 我们在自动部署期间需要它,并且看到“不可能删除正在运行的容器”错误,这些错误伴随着上面评论中给出的更多“蛮力”删除行。

docker ps -a | grep "Exit " | grep -v "CONTAINER ID" | cut -c-12 | xargs -L1 bash -c 'if [ $0 == 'bash' ] ; then : ; else docker rm $0; fi'

不知道今天在哪里,但认为 FWTW:

docker clean这样的东西应该有模式(或者这些应该是单独的(子)命令),比如:

  • prune (默认):仅删除悬空* 容器 + 图像
  • all-except-tagged :删除所有未标记的容器及其图像
  • all-except-running :删除所有容器+图像,除了那些正在运行的
  • all :删除所有内容

*dangling 表示不在当前“分支”中的容器。 您可以将标记容器视为 git 中的命名分支。 所有依赖提交容器都应该保持缓存(用于重建目的)。 但是所有本身没有标记的容器或那些标记的依赖项,都应该被删除。 将此视为“垃圾收集”,而不是“清洁”。 也许docker gc

@shykes一旦图像运行到 0 引用计数,仍然需要一个干净的命令来实际执行垃圾收集。

@shykes我还想请您重新考虑在没有解决方案的情况下关闭此票证,例如@jbenethttps://github.com/dotcloud/docker/issues/928#issuecomment -33217851 中的建议。 在构建和重建映像数十次后,我遇到了严重的磁盘空间问题。

@shykes我同意@dscho @drewcrawford - 仍然缺少docker clean功能。 如果您仍然需要手动删除每个容器(或使用手工制作的壳管),则为容器命名并没有真正的帮助。 请重新打开问题。

当自动部署失败时,这尤其令人沮丧。

我跑了docker images | grep '<none>' | grep -P '[1234567890abcdef]{12}' -o | xargs -L1 docker rmidocker ps -a | grep \"Exit \" | grep -v \"CONTAINER ID\" | cut -c-12 | xargs -L1 bash -c 'if [ $0 == 'bash' ] ; then : ; else docker rm $0; fi'并得到了大约 4Gb。 删除停止的容器和没有标签的镜像。

作为一个更简单的例子:

# delete all stopped containers (because running containers will harmlessly error out)
docker rm $(docker ps -a -q)
# delete all untagged images
docker rmi $(docker images | awk '/^<none>/ { print $3 }')

我经常需要查找这个命令,所以写了一个关于有用清理命令的小教程 - http://blog.stefanxo.com/2014/02/clean-up-after-docker/

如果这可以成为 cli 中的本机功能,那就太好了

@mastef我同意; 如果主要的“docker”命令不应该被这样的功能污染,也许是dockerutils命令的形式? 例如dockerutils cleanupimages等。

(otoh - dockerutils 脚本可以开发为 3rd 方的东西/贡献)

可能是什么,或者作为docker rmdocker rmi ? - 例如docker rm --stoppeddocker rmi --untagged

@mastef我想这可能是一个选项,但是

不确定这是否是本次讨论的正确位置,例如在 docker-dev / docker-user 上,或者应该创建一个单独的问题。 也许“核心”开发人员中的某个人可以发光? @天能

我有 19 场未使用的容器/图像的事实是荒谬的。 如果它没有标记,我不想要它。 我不应该清理 docker 的烂摊子。

@thaJeztah docker 中有许多很少使用的选项; 但是这个一直在使用。

@mastef同意。 回顾你的想法,按照你的建议去实施可能是好的; 即docker rm --stopped或者,也许更好docker rm --cleandocker rmi --clean以保持一致。

实现docker rm --clean时应格外小心,因为停止的容器仍可用作仅数据/卷容器,但我认为 API 可以检查它们是否仍被使用/链接。

我喜欢让它更明确和简单的想法

docker rm --stopped很好,和盒子上说的一模一样

docker rmi --untagged似乎比--clean更明显

我同意@shykes 的观点,清洁的定义会因人而异,但停止和未标记不会,这些是 docker 概念。

不得不求助于更难记住的涉及 awk 的链式命令是常见工作流程中不必要的复杂性。

请重新打开这个,这对新人来说是一个真正的痛苦。

docker rm `docker ps --no-trunc -a -q`

自从我开始试验以来,这是我输入最多的 docker 命令之一,如果没有本地使用它看起来真的很奇怪。

@mgcrea你不需要--no-trunc并且你可以分组选项,你可以这样做:

docker rm `docker ps -aq`

:微笑:

+1 @mastef解决方案

+1 @mastef

仅供参考,我已经开始使用这里的@blueyed shell 脚本https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup

做的比较好。

:+1:

作为记录,要删除悬空图像:

docker rmi $(docker images --filter dangling=true --quiet)

@yajo我已经看到这现在也记录在这里: http : //docs.docker.com/reference/commandline/cli/

@wyaeld该脚本似乎对我不起作用。 脚本本身不做任何事情,也不提供任何输出。 但是当我尝试手动运行命令时,我收到 awk 的语法错误:

josh@ThinkPad-T430 ~ docker ps -a | tail -n +2 | awk '$2 ~ "^[0-9a-f]+$" {print $'$1'}'
awk: cmd. line:1: $2 ~ "^[0-9a-f]+$" {print $}
awk: cmd. line:1:                            ^ syntax error

不知道为什么它不起作用,我有一个完整的团队在许多机器上使用它而没有问题。

也许您的 bash 或 awk 版本不寻常

奇怪的。 我正在使用 Ubuntu 14.04 中的版本。 我以为可能是因为我使用的是 zsh,但是我加载了 bash 并再次运行它并得到相同的错误。

@ingenium13
你可以不喜欢这个手动运行: $1$'$1'意味着是函数的参数,应该是0或1,所以下面应该工作: docker ps -a | tail -n +2 | awk '$2 ~ "^[0-9a-f]+$" {print $0}'

试着理解脚本/函数的作用:也许你所有的图像/容器都被标记了? 例如,查看docker ps -a的第二列的输出。

但它在这里是题外话,你应该在我的 dotfiles 中提出一个关于它的问题。

此外,至少应该有这样的输出(当没有任何东西被清理时):

Removing containers:
Removing images:

@tianon @ingenium13为了与其他 shell 兼容,我建议通过xargs管道输出:

alias docker-clean='docker ps -a -q | xargs -r docker rm'

我已将此行放入我的 .zshrc 中,并且效果很好。

@stucki您不必打开管道或使用xargs

对于容器:

docker rm $(docker ps -aq)

对于图像:

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

这么多基于不同shell的解决方案

现在 docker native 命令怎么样?

@razic我知道这个解决方案,但据我了解以前的帖子, $的引用导致了问题。 使用xargs则不需要。

除此之外,当您有很多框时, xargs 会更好,因为如果参数列表变得太长,它会将列表拆分为多次执行运行...

@mastef :+1: ;-)

@stucki很好的建议,谢谢

无耻地宣传我的图像,删除了任何容器未使用的所有图像: https : bobrik/image-cleaner

@雅乔:+1:

docker rm $(docker ps -aq)
docker rmi $(docker images --filter dangling=true --quiet)

@mastef :+1: 到“这么多基于不同 shell 的解决方案/现在 docker 本机命令怎么样?”

@masterf :thumbsup: “这么多基于不同 shell 的解决方案/现在使用 docker 本地命令怎么样?”

docker rmi --untaggeddocker rm --stopped会很棒。 消除了“干净”含义的任何自以为是的歧义,并提供了大多数人似乎正在寻找的功能。

是的! +1 @克里斯福斯特雷利

+1 来自@chrisfosterelli的简单格式

--stopped 选项可以采用时间过滤字符串形式的可选参数,以仅清理早于 X 的容器。

+1 至少为rmi --stopped ,但docker clean会更好。

我们的图像周转率很高,并且由于命令行脚本无法可靠运行,因此磁盘空间不断不足。

是不是该重新打开这个问题了? 我们的工具箱中确实缺少一个适当且易于记忆的 clean 命令。

docker rmi不会生成图像列表 - 它只会删除它所告诉的内容。

该列表可以使用docker ps --filter... -

@mikehaertl我建议添加额外的--filter选项的提案 PR,这些选项添加了更多有助于定义“干净”概念的过滤器(例如,过滤器以显示所有容器尚未运行超过一个星期?)。

@hobofan - 如果脚本不能可靠地工作,那么请与其他人一起解决这个问题 - 特别是@chrisfosterelli的建议是将代码添加到 docker,它会调用与你的脚本完全相同的东西 - 所以找到找出失败的原因也会阻止 go 实现

例如

docker rmi --stopped将与键入docker rmi $(docker ps -qa --filter status=exited ) - 如果在脚本中失败 - 它很可能也会由于相同的原因在 docker 中失败。

mm,我不知道docker rmi --untagged是什么意思,因为您无法更改容器的名称 - 这是否意味着删除所有基于现在没有标签的图像的容器?

@SvenDowideit由于 shell 实现的差异和 docker 命令的输出更改,脚本更容易中断。 当然,您可以使用 Docker API,但这会导致一些复杂的脚本。

docker ps -q与`docker ps | 相同 awk '{print $1}',但因为这是经常需要的东西,所以它是内置的。

目前,如果我是正确的,甚至没有办法删除容器的相应图像,更不用说显示容器图像 ID 的方法了。 docker ps -q返回容器 ID,而docker rmi需要图像 ID。

添加更多--filter选项听起来合理,可能是朝着正确方向迈出的一步,但从长远来看,可通过 API 访问的内置clean命令将真正有助于构建基于Docker(例如 Mesos)。

我的建议是通过添加过滤器来偷偷摸摸:)

+1 @克里斯福斯特雷利

请注意,在清理图像和容器时,请注意从活动 docker 实例下删除容器和图像。 我们在 docker 构建期间遇到了清理镜像的问题。 和其他人报告说清洁容器。 https://github.com/docker/docker/issues/8663

此问题已于一年半前关闭,因为“我们将进行垃圾收集,因此不需要清理命令”。 据我所知,仍然没有这样的 GC 过程,用户仍在努力控制他们的 Docker 磁盘空间使用。 在有我们可以使用的实际解决方案之前,我们可以重新打开这张票吗?

+1 @stevenschlansker; 至少应该有一个商定的"最佳实践"方法。

我目前正在使用:

docker rmi $(sudo docker images --no-trunc=true --filter dangling=true --quiet)

但这似乎有点粗鲁,并且容易从正在运行的容器下面删除图像(尽管我还没有做到这一点)。

+1 重新开放。

我还没有看到从容器下发出的图像,但是我看到构建图像时出现故障它们看起来像这样:

23:48:33 Step 7 : RUN useradd -u 1001 -m buildfarm 23:48:36 ---> Running in b12de18eeda1 23:48:38 ---> a59d6862a9ca 23:48:38 Removing intermediate container b12de18eeda1 23:48:38 Step 8 : RUN mkdir /tmp/keys 23:48:41 time="2015-02-21T07:48:41Z" level="info" msg="no such id: 07042adaa5f5d74a927301ca83fb641e0ecf49b18329e442cda5eef26c3f1429" 

出于我们的目的,我们的清理脚本已经增加到 176 行 python,以保持我们的系统运行而不会崩溃。 而且我们必须保留大量可用磁盘空间,因为在长时间的持续构建期间,我们无法像创建它们一样快速清理镜像和容器。

如果有人想看看我们的清理脚本在这里: https :

这是一个 python 脚本,它根据所需的可用空间和可用百分比以及要检查磁盘空间的挂载点进行参数化。 它具有删除最小年龄的选项。 它会记录活动以供日后查看。

它使用 docker python 客户端来内省容器和图像,然后在删除它们之前对它们进行排序和过滤,直到所需的磁盘空间可用或没有可用空间为止。

我有一个问题,当我删除停止的容器时,它们会在几天后再次启动。 当我用 ="sudo docker rm containername" 删除容器时,我的服务器的卷 (GB) 的使用是相同的。 如何准确清除容器以恢复服务器容量 (GB) 的使用量?

如何查看我的容器使用了多少空间(体积)?

值得一提的是,我刚刚遇到了一个问题,即使用内置的 docker 命令来清理旧图像会为我节省很多时间。

我使用 Hudson 在 Docker 容器中部署新应用程序。 Hudson 作业停止旧容器,移除命名镜像,然后拉下一个新容器并启动它。 不幸的是,我开始耗尽空间,并且在我清理时不小心停止了一些容器。

我怀疑镜像安装有问题,我重新启动,删除所有容器和镜像,并重新部署所有内容。 没什么大不了的,15分钟左右。 但是,我发现在这个过程之后我重新获得了大约 8G 的磁盘空间,这在 20G 实例上是可观的。

对于在生产中运行,我希望有一种受支持的方式来避免这种混乱。 当然,我们可以通过脚本来摆脱它,但在我看来,真正的解决方案应该来自 Docker。

我想再次强调@thaJeztah之前的观点,因为这个线程中有很多噪音。 此处描述的大多数用于解决缺少的clean选项的脚本都会使卷容器失效。

小心。

此处描述的大多数用于解决缺少的 clean 选项的脚本都会核对卷容器。

@kojiromike这就是我提出这个建议的原因: https :

@mikehaertl决定是否可以通过名称的存在安全地移除容器与移除超过 1 个月的容器或移除带有非零状态代码的容器一样随意。

@hobofan这个想法是,删除_没有_名称的容器。 通过这种方式,您可以通过为它们命名来安全地防止您的卷容器被删除。 这当然现在不起作用,因为 _every_ 容器总是有一个名字,由于(IMO 无用的)自动命名功能。

@mikehaertl我理解这一点,但是应该保护所有具有名称的容器不被删除的概念对我来说似乎很武断,不能解决一般问题,而只能解决保护卷容器的问题。 从 1.6.0 开始,解决该问题的更好方法是以某种方式标记要保护的容器,然后通过它们进行过滤(遗憾的是还没有用于标签的过滤器标志)。

遗憾的是,目前还没有用于标签的过滤器标志

实际上,有,但是 iirc 在 1.6 发布时它不在文档中:)

  1. 自动命名不是没用,它很棒。
  2. 名称不应因作为容器是否是临时的指示器而过载。
  3. 标签是有意义的,尽管早期拉取请求中的会话方法也很有意义。

我们正在认真考虑使用jpetazzo/dind来模拟这里的会话。 一旦我们完成了一项工作,我们就可以对 dind 容器进行核爆,我们肯定知道我们得到了它所包含的所有容器。

+1 用于标签拉取的 TTL 选项

很抱歉没有阅读整个问题,搜索TTL没有显示结果,所以......这是我的建议。

我建议在图像拉标签上添加一个TTL选项。
在 CD 环境中,注册表将存储大量不需要的图像...:/

对于自动清理/垃圾收集,有“Sherdock”,它是在 DockerCon 2015 黑客马拉松期间创建的; https://github.com/rancher/sherdock http://rancher.com/sherdock/

抱歉,我的建议不是在本地卷上添加clean ,而是为注册表拉取。 注册表会知道图像是否应该活着,也许我们也可以在本地卷上实现它(通过将 TTL 从注册表传输到 docker 服务器)。

这怎么还是一个悬而未决的问题? Sherdock 很棒,但前提是您的系统能够启动另一个容器——我在 Web 界面中没有看到管理远程系统的选项。

由于磁盘已满,我的整个平台都关闭了,更糟糕的是,上面的命令在我的情况下实际上都不起作用。 除了 Sherdock(见上文)。

有没有比几个 shell 脚本和一个衬垫更好的解决方案?

确实,Sherdock 看起来很有趣——但是如果您管理着数十台主机,那么拥有 Web UI 会适得其反。 一个合适的解决方案需要可编写脚本和自动化。

我们一直在运行上面几个脚本的组合,但不幸的是发现

  • 似乎没有一个能够可靠地清理所有可能泄漏的资源,每个都做了一些略有不同的子集
  • 他们都潜入内部 Docker 目录,这是脆弱的——升级到 1.7 导致我们的清理脚本默默地删除正在使用的卷和图像层(!)
  • 它们都受到竞争条件的影响——如果你列出图像,检查它们是否被使用,然后尝试删除一个,然后有人可能会尝试同时使用该图像并导致错误。 很难判断这些错误是实际故障还是只是并发问题

我仍然看不出有什么理由应该关闭这个问题,显然这是一个痛点,影响了许多在“在生产中运行 Docker”路径最远的用户,并且核心之外的解决方案似乎非常困难/不可能正确执行。

我喜欢 docker 如何让我的开发人员生活变得如此轻松。 例如,使用像 compose 这样的工具,即使在几分钟内与我的设计师同事共享一个有点复杂的开发设置也变得如此简单。

一段时间后,您又发现了不太好的部分,您开始认真地怀疑:_什么..!?_ 声称是“包括电池” - 但不知何故,这只是事实的一半。 这就像您需要 4 块电池,但只包含 3 块。 当你在玩了一段时间后查看你的硬盘发生了什么时,Docker 真的可以表现得像一个“垃圾虫”。

该手册并没有真正提到这一点,您需要自己找出如何摆脱 docker 留下的所有垃圾(废弃卷是必须删除的痛苦 - 您需要找到第 3 方“电池” "第一)。

对我来说,感觉现在投入了大量精力来扩展 docker 工具堆栈,而一些非常基本但仍然必不可少的缺失功能却被简单地忽略了——即使用户一次又一次地要求它们。

我对这个线程的第一个贡献是请求 docker 容器的会话超时(自动清理)

现在 --rm 已实施,我觉得需要进行清理不那么紧迫了。 即使我在每台服务器上都有用于清理的 bash 脚本,这有点尴尬。

由于这个线程没有任何进展......我认为我们应该建议一个适合大局的新功能或放弃它。

总会有新功能要添加,旧错误要修复等(请注意,有 900 多个问题和 100 多个 PR,我们每周合并或关闭 100 多个 PR)。

值得注意的是, docker clean不是正确的方法,这就是关闭的原因。 你要打扫什么?
悬空的图像? docker rmi $(docker images --filter dangling=true)
停止容器? docker rm $(docker ps -aq)

docker clean除了一个仅对一小部分用户有用的额外命令之外没有添加任何内容......然后只是语法糖。

@cpuguy83
有了这个论点,你就轻松了一点。 显然需要进行适当的垃圾收集。 码头工人仍然缺乏的东西。

虽然我完全同意不实施简单的语法糖,但确实缺少一些东西。

我认为每当一个已解决的问题引起很多关注时,我们都应该查看原因,以及 docker 是否确实可能遗漏了一些需要的东西。

所以请让我们寻找建设性的想法,用对每个参与者都有意义的功能来填补空白。

对于清除未使用的 Docker 映像的远程选项,我参与了一个尝试解决此问题 (CloudSlang) 的项目,该项目使用 SSH/REST 从主机清除映像,并且仍然提供逻辑上的灵活性。
这是一个关于如何使用它清除 CoreOS 集群的博客: https ://www.digitalocean.com/community/tutorials/how-to-clean-up-your-docker-environment-using-cloudslang-on-a-coreos

我们可以详细说明它以提供更多“清洁”功能......

我认为至少应该在关闭此问题之前将那些用于悬挂图像和停止容器等的方便命令放置在文档的可见区域中。 也许是相关部分或常见问题解答区,甚至是“维护 Docker 长期”部分,可以在各个方向上指导用户。 通过这种方式,我们展示了可以进行的各种清洁工作,并提供了执行这些工作的起点。

悬空的图像? docker rmi $(docker images --filter dangling=true)
停止容器? docker rm $(docker ps -aq)

docker clean 除了一个仅对一小部分用户有用的额外命令之外没有添加任何内容......然后只有语法糖。

这很有用,因为用户不会经常清理他们的图像。 通常每1-3个月一次。 到那时,每个人都忘记了要使用的 cmd。 而docker clean可以轻松检查man--help 。 如果需要除docker rmi $(docker images --filter dangling=true)之外的更高级用法。 哎呀,每次我都忘记了,不得不查一下。 无用。

(再次)遇到这个问题,不得不(再次)钻研 Docker 问题来修复它。 +1 表示语法糖。

@cpuguy83此外,您提出的“语法糖”实际上并不正确。 例如,您的命令docker rmi $(docker images --filter dangling=true)会受到竞争条件的影响——它可以与docker run之前悬空的图像竞争并导致错误。

这不是假设的竞争条件。 它影响了我们将近 50% 的清理运行(每个运行需要数十分钟,我们安排了 _lot_ 任务!)

这使得编写能够区分故障模式的正确实现几乎不可能,并且操作员需要手动将其全部分类。 当你维护一个由 100 台机器组成的集群时,这会很糟糕,这些机器不断地填满它们的磁盘。

+1 给@stevenschlansker
我们的情况与@stevenschlansker 描述的情况惊人地相似。 我们尝试通过使用--rm来缓解这个问题,但有时容器不能正常退出并被遗留下来。

也许可能有DELETE /images?filter=<filter spec> ,我们可以在该过程中锁定图形。

但我也认为在调用rmi时不应该有任何种族问题,除非rmi正在处理中,但图像仍然可用于run 。 将不得不看。

绝对同意,图像删除非常快速。
这将需要大量的工作来清理......我已经打开了一个问题来跟踪:#16982

谢谢你看。 得到证实我们还没有(还)完全失去理智是件好事;)

@stevenschlansker谢谢! 我们需要防止添加并非严格需要的功能(或可以通过其他方式合理解决),但在这种情况下,“解决方法”不是解决方案是正确的:+​​1:

这是为什么这种情况真的很糟糕的另一个例子。 看看迄今为止我发现的最好的脚本之一来“清理”Docker:

https://github.com/chadoe/docker-cleanup-volumes/blob/master/docker-cleanup-volumes.sh

它不仅非常复杂,而且有多个错误导致它从正在运行的容器中删除正在使用的卷: https :

这是最先进的。 我昨天错误地升级到 Docker 1.8.3 并绊倒了这个错误。 现在今天早上我有大约 30 个愤怒的用户来找我询问他们的数据在哪里......但一切都消失了:(

是的。 我还犯了一个错误,即使用 3rd 方工具对我未使用的卷进行所谓的“清理”。 它只是删除了我所有的 docker 卷……真的不喜欢那样。

我和一个朋友整理了一个脚本,可能会对你们中的一些人有所帮助。 该脚本使用docker-clean [option flags]运行一些过滤的命令。 我们将它放在一起以帮助简化在多台机器上运行许多相同的命令,并已成为我们 docker 工作流程的重要组成部分。

检查一下,让我们知道您的想法,并打开您想要查看或分叉并拉取的功能的任何问题!

https://github.com/ZZROTDesign/docker-clean

alias docker-clean = 'docker rm $(docker ps -a -q) && docker rmi $(docker images -q) && docker ps -a | 切-c-12 | xargs 码头工人 rm'
删除 docker 容器,然后是 docker 镜像,最后清除缓存

自从这个线程开始提出许多不需要脚本批处理的额外建议以来,已经过去 2 年多了,比如docker rm --stoppeddocker rmi --untagged等。因为我仍然收到关于这个的通知,让我们用混音经典来庆祝吧。

You have ten seconds

这现在由prune子命令处理。

  • docker builder prune (用于删除旧的构建缓存)
  • docker container prune
  • docker image prune
  • docker network prune
  • docker volume prune

一次性完成所有操作:

  • docker system prune (默认不删除任何卷)

    • 运行docker system prune --volumes可以删除卷。

文档:

(为仍在阅读此线程的任何人发表评论,例如从 StackOverflow 链接到这里。)

此页面是否有帮助?
0 / 5 - 0 等级