如何清理docker overlay目录?

ted*_*r42 33 amazon-web-services docker coreos

我通过CoreOS和AWS的ECS运行docker.我有一个失败的图像多次重新启动,容器仍然在周围 - 他们填满了我的驱动器分区.具体来说,/var/lib/docker/overlay/包含大量文件/目录.

我知道docker-cleanup-volumes是一个东西,但它清理/ volumes目录,而不是/ overlay目录.

docker ps -a显示我的坏Docker容器超过250次启动尝试.但他们没有跑步.

除此之外rm -rf /var/lib/docker/overlay/*,我该如何/我应该清理它?

use*_*109 28

从我们这边我们使用:

sudo docker system prune -a -f
Run Code Online (Sandbox Code Playgroud)

哪个省我3Go!

我们还使用着名的命令:

sudo docker rm -v $(sudo docker ps -a -q -f status=exited)
sudo docker rmi -f  $(sudo docker images -f "dangling=true" -q)
docker volume ls -qf dangling=true | xargs -r docker volume rm
Run Code Online (Sandbox Code Playgroud)

我们把它放在cron上来管理我们的磁盘空间.

干杯

参考:https: //forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604/4

  • 救星!我不知道为什么 ``df`` 说我的 ec2 卷已满,直到我在我的 ``/var`` 目录上运行 ``ncdu`` ,这导致我来到这里!我从第一个命令中回收了 280+ GB! (5认同)
  • 小心第三个命令(`... xargs -r docker volume rm`)。确保在运行此命令时可能使用这些卷的容器正在运行。否则,它们将被视为悬空,因此被删除。 (4认同)

ted*_*r42 11

这是我现在正在做的黑客方式.我不会接受它作为答案,因为我希望有更好的方法.

# delete old docker processes
docker rm `docker ps -a | grep Exited | awk '{print $1 }'`
  ignore_errors: true

# delete old images. will complain about still-in-use images.
docker rmi `docker images -aq`
Run Code Online (Sandbox Code Playgroud)

  • `awk` 可以过滤:`docker ps -a | awk '/Exited/{ 打印 $1 }'`。不错的黑客虽然。 (2认同)

Chr*_*itz 9

这不是真的!

/var/lib/docker/overlay2顾名思义,包含一堆overlay文件系统(这里有很好的介绍)。运行mount | grep overlay2,您将看到所有/var/lib/docker/overlay2/*/merged文件夹都是类型为 mount 的overlay。这意味着所说du的不是真实的。为了了解这些文件夹(在磁盘上)实际使用了多少空间,您需要将注意力限制在upperoverlayfs挂载的目录(diff在docker的情况下称为),例如:

du -sch /var/lib/docker/overlay2/*/diff
...
3.8G    total
Run Code Online (Sandbox Code Playgroud)

作为比较,就我而言:

> du -sch /var/lib/docker/overlay2
...
17G total
Run Code Online (Sandbox Code Playgroud)

更新

看来您也可以简单地使用du's -x/--one-file-system选项(“跳过不同文件系统上的目录”)来仅查看真实部分:

> du -schx /var/lib/docker/overlay2
Run Code Online (Sandbox Code Playgroud)


小智 9

docker builder prune
Run Code Online (Sandbox Code Playgroud)

这有助于清理 docker overlay2 文件夹


ana*_*tik 7

我已经在我的开发环境中将它添加到bashrc中,并且习惯于每天运行它.

function cleanup_docker() {
  docker ps -f status=exited -q | xargs -r docker rm
  docker images -f dangling=true -q | xargs -r docker rmi
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,以下脚本可以释放更多空间,因为它会尝试删除所有图像,并且只是无声地失败:

function cleanup_docker_aggressive() {
  for i in $(docker images --no-trunc -q | sort -u)
  do
    docker rmi $i 2> /dev/null
  done
}
Run Code Online (Sandbox Code Playgroud)

可悲的是,它们并不比你的解决方案更清洁.

编辑:从Docker 1.13开始,您可以使用docker系统:

docker system df    # to check what is using space
docker system prune # cleans up also networks, build cache, etc
Run Code Online (Sandbox Code Playgroud)

编辑:从Docker 2017.09开始,您还可以使用容器图像

docker container prune
docker image prune -a
Run Code Online (Sandbox Code Playgroud)

后者你可以使用像花哨的过滤器 --filter "until=24h"


woo*_*dvi 7

码头工人

  • - 安静的

  • - 全部

  • --过滤器状态=已退出


码头工人

  • - 力量

docker 图片

  • - 安静的
  • - 全部
  • --过滤悬空=true

docker rmi

  • - 力量

你的hacky方式没问题。

docker rm `docker ps -a | grep Exited | awk '{print $1 }'`
Run Code Online (Sandbox Code Playgroud)

我的黑客方法是

docker rm $(docker ps --all | awk '/ago/{print $1}')
Run Code Online (Sandbox Code Playgroud)

docker ps一种稍微简洁的方法是使用(-q) 标志运行--quiet以仅获取 id 号并--filter status=exited仅过滤已退出的 id 号。

docker rm $(docker ps --filter status=exited --quiet) # remove stopped docker processes
Run Code Online (Sandbox Code Playgroud)

docker rm或者使用--force(-f) 标志运行并docker ps使用--all(-a) 标志甚至关闭正在运行的程序

docker rm --force $(docker ps --all --quiet) # remove all docker processes
Run Code Online (Sandbox Code Playgroud)

在几次失败的构建之后,可能占用所有磁盘空间的是映像。为了节省 docker 主机上的磁盘空间,请定期删除未使用的 docker 镜像

docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images
Run Code Online (Sandbox Code Playgroud)

或者为了变得更激进,您可以--force(-f) 它来清理--all(-a) 图像

docker rmi --force $(docker images --all --quiet) # clean all possible docker images
Run Code Online (Sandbox Code Playgroud)

@analytik 将其放入.bashrc函数的方法似乎是一个实用的想法

function cleanup_docker() {
  docker rm --force $(docker ps --all --quiet) # remove all docker processes
  docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images
}
Run Code Online (Sandbox Code Playgroud)

如果您习惯生成大量不需要的 docker 镜像,请将其添加到.bash_logout



小智 5

我们刚开始遇到这个问题,而btafarelo的回答让我有些困惑,或者至少让我对删除sha256条目感到更好。

系统信息:在ELB后面运行CoreOS 1.12的ec2实例

重新启动服务后,这恢复了大约25%的磁盘,而没有不良影响。