如何清理docker overlay目录?

时间:2015-07-29 22:29:16

标签: 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/*之外,我该怎样才能清理它?

10 个答案:

答案 0 :(得分:18)

从我们这边使用:

sudo docker system prune -a -f

哪能救我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

我们把它放在cron上以便更有效地管理磁盘空间。

干杯

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

答案 1 :(得分:10)

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

# 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`

答案 2 :(得分: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
}

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

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

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

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

docker system df    # to check what is using space
docker system prune # cleans up also networks, build cache, etc

编辑:从Docker 2017.09开始,您还可以使用containerimage

docker container prune
docker image prune -a

后者可以使用像--filter "until=24h"

这样的花哨过滤器

答案 3 :(得分:4)

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

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

  • 从ELB中排空泊坞窗实例
  • 关闭泊坞窗

    systemctl stop docker
    rm -rf /var/lib/docker/overlay/*
    
  • 执行命令的结果

    for d in $(find /var/lib/docker/image/overlay -type d -name '*sha256*'); do echo rm -rf $d/* ; done
    
  • 重启(最简单的方法让所有东西重新上线)

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

答案 4 :(得分:2)

docker ps

  • - 安静

  • - 所有的

  • - 过滤状态=已退出

docker rm

  • - 力

码头图片

  • - 安静
  • - 所有
  • - filter dangling = true

docker rmi

  • - 强制

你的hacky方式很好。

docker rm `docker ps -a | grep Exited | awk '{print $1 }'`

我的hacky方式是

docker rm $(docker ps --all | awk '/ago/{print $1}')

稍微更简洁的方法是使用docker ps( - q)标记运行--quiet以获取ID号,并{ - 1}} - 仅过滤掉已存在的标识。

--filter status=exited

或使用docker rm $(docker ps --filter status=exited --quiet) # remove stopped docker processes ( - f)标志运行docker rm,使用--force( - a)标志运行docker ps以关闭正在运行的标志

--all

在几次失败的构建之后,可能占用所有磁盘空间的是图像。要节省docker主机上的磁盘空间,请使用

定期删除未使用的docker镜像
docker rm --force $(docker ps --all --quiet) # remove all docker processes

或为了更积极,您可docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images ( - f)清理--force( - a)图片

--all

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

docker rmi --force $(docker images --all --quiet) # clean all possible docker images

如果您习惯于生成许多您不需要的泊坞窗图像,请将其添加到.bash_logout

答案 5 :(得分:1)

Docker垃圾收集可以使用另一个docker容器以简单的方式完成 https://github.com/spotify/docker-gc

您可以使用https://github.com/flaccid/docker-docker-gc-crond

将其作为cron运行

答案 6 :(得分:1)

这是一个可行的选择:

docker rm -f $(docker ps -a |awk 'NR>1&&/Exited/{print $1}')

答案 7 :(得分:1)

我遵循了这些简单的步骤

步骤1:df -h [检查已使用的内存,以确保覆盖文件夹使用了内存。]

步骤2:sudo docker system prune [此cmd删除所有未使用的容器/图像/网络]

步骤3:sudo docker image prune -a [对于任何悬空的图像,如果存在的话]

第4步:df -h [确保已删除覆盖数据]。

答案 8 :(得分:0)

小心,这个解决方案似乎删除了其他重要的东西。

您需要检查图像/容器并删除/ opt / docker / overlay中检查执行中未找到的文件夹

docker inspect $(docker ps -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt

docker inspect $(docker images -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt

sudo ls -l /var/lib/docker/overlay > overlays.txt

diff -u  inspect-hashs.txt overlays.txt | grep -E '^\+' | grep -oE '[a-f0-9]{64}' | xargs sudo rm -rf /opt/docker/overlay/

答案 9 :(得分:0)

此处是从https://lebkowski.name/docker-volumes/

清除docker overlay目录的解决方案
docker images --no-trunc | grep '<none>' | awk '{ print $3 }' | xargs -r docker rmi

docker ps --filter status=dead --filter status=exited -aq | xargs docker rm -v

for Docker&lt; 1.9:

find '/var/lib/docker/volumes/' -mindepth 1 -maxdepth 1 -type d | grep -vFf <(docker ps -aq | xargs docker inspect | jq -r '.[]|.Mounts|.[]|.Name|select(.)')

或者对于Docker&gt; = 1.9:

docker volume ls -qf dangling=true | xargs -r docker volume rm