设备上没有Jenkins和Docker的空间 - 如何正确清理

Aar*_*ron 6 jenkins jenkins-plugins cloudbees docker jenkins-docker

我们在Ubuntu 16.04.1服务器上运行Jenkins(版本2.60.1).我们最近遇到的一个问题是我们经常得到错误" 设备上没有剩余空间 ".

我知道在使用Docker时需要进行严格的清理过程,因为文件会留下并占用不必要的空间.

我们使用CloudBees Docker Build and Publish插件来处理构建并推送到AWS ECS.我想删除所有未使用的图像.问题是如果我登录Jenkins实例(通过SSH)并尝试运行它提供的docker命令 - "无法连接到Docker守护程序.这个主机上是否运行了docker守护程序?"

我想我需要在Jenkins环境或插件的一部分中做到这一点?

有人之前处理过此事或有过一些建议吗? - 我真的很感激.

Szy*_*iak 6

Docker <1.13

对于早于1.13的Docker,您可以执行以下操作清理设备上的某些空间:

docker ps -a | grep -i 'exited' | awk '{print $1}' | xargs docker rm > /dev/null 2>&1 &
docker images -a | grep "<none>" | awk '{print $3}' | xargs docker rmi > /dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)

或者,您可以尝试运行以下docker命令:

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
Run Code Online (Sandbox Code Playgroud)

它将清理旧的孤立容器,并删除带有标记的图像<none>。我在我的CI服务器之一上使用了这两个公式,效果很好。在此之前,我面临着与您的问题类似的问题(设备上没有剩余空间)。

清理孤立卷

docker volume rm $(docker volume ls -qf dangling=true)
docker volume ls -qf dangling=true | xargs -r docker volume rm
Run Code Online (Sandbox Code Playgroud)

码头工人> = 1.13

Docker 1.13引入了docker system prune命令(https://docs.docker.com/engine/reference/commandline/system_prune/)。或者,您可以运行:

  • docker image prune
  • docker volume prune
  • docker container prune

您可以将这些命令作为Jenkins管道的一部分运行。在发布的过程中,在我从事的一个项目中,我们在构建新的Docker映像后运行清理。也尝试尝试修复“无法连接到Docker守护程序。Docker守护程序是否在此主机上运行?” 问题。


bur*_*ttk 2

为了解决“无法连接到 docker docker daemon”问题,请弄清楚 docker 组中有哪些用户

grep 'docker' /etc/group
Run Code Online (Sandbox Code Playgroud)

然后作为这些用户之一运行 docker cleanup 命令(您需要将其转换为在 cron 或其他东西上运行的脚本)。或者通过其他用户获取 sudo 访问权限并使用 sudo:

sudo docker rmi [image_name_here]
Run Code Online (Sandbox Code Playgroud)

这是示例清理脚本(或类似脚本)的内容/usr/local/bin/clean_up_docker_stuff_on_ci_agent

#!/bin/bash

# stop containers that have been running for more than a day (may not be valid in your context if you intend run things for a long time)
docker ps -a | egrep " days" | awk '{print $1}' | grep -v CONTAINER | xargs docker stop

# remove all exited containers
docker ps -a | egrep "Exited|Created" | awk '{print $1}' | grep -v CONTAINER | xargs docker rm

# remove old images
docker images | egrep 'weeks|months' | awk '{print $1 ":" $2}' | xargs docker rmi -f
docker images | egrep 'weeks|months' | grep '<none>' | awk '{ print $3 }' | xargs docker rmi -f

# kill stray volumes
docker volume ls -qf dangling=true | xargs -r docker volume rm
Run Code Online (Sandbox Code Playgroud)

正如 Szymon Stepniak 在他的回答中提到的,如果您使用 docker >= 1.13,则有更简单的选项。

cron 示例(每小时 20 次):

20 * * * * /usr/local/bin/clean_up_docker_stuff_on_ci_agent > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)