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

时间:2017-07-16 12:46:18

标签: docker jenkins jenkins-plugins cloudbees jenkins-docker

我们在Ubuntu 16.04.1服务器上运行Jenkins(版本2.60.1)。我们最近遇到的一个问题是,我们经常会收到错误“设备上没有空间”。

我理解使用Docker时需要进行严格的清理过程,因为留下的文件占用了不必要的空间。

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

我想不知怎的,我需要在Jenkins环境或插件的一部分中执行此操作?

之前有人处理此事或有任何建议吗? - 我真的很感激。

5 个答案:

答案 0 :(得分:5)

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 &

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

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

它将清除旧的孤儿容器,并删除用<none>标记的图像。我在我的一个CI服务器上使用这两个公式,它工作正常。在此之前,我面临着类似于您的问题(设备上没有剩余空间)。

清理孤儿卷

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

Docker&gt; = 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镜像后运行清理。尝试修复&#34;无法连接到Docker守护程序。 docker守护程序是否在此主机上运行?&#34;问题

答案 1 :(得分:2)

在使用下面的burnettk提供的脚本之后,似乎虽然在运行更多构建的时间后释放了一些空间,但我回到了同一个地方,我的EBS卷上没有空间。我只需添加更多存储空间并在我的月度账单上支付更多费用就没有意义。

在进行一些调查时,我发现对于每个构建,大约创建了7个图像(docker图像-a),每个图像包含大约1.4GB,即9GB / build。前两个标记为build#和latest,而其余标记为。

所有这些图像都存储在此服务器上并不重要,因为它的目的是构建,无论如何它们都被推送到ECR。所以我在脚本中添加了以下内容,以便只保留最新的docker镜像:

docker rmi $(docker images | sed 1,3d | awk '{print $3}')

最后,我还通过添加--rm参数调整了我的docker build命令,以便在构建之后删除中间容器。

docker build --rm

希望这有用!

答案 2 :(得分:1)

为了超越&#34;无法连接到docker docker daemon&#34;问题,弄清楚用户在docker组中的用途

grep 'docker' /etc/group

然后运行docker cleanup命令(您希望将其转换为您在cron或其他东西上运行的脚本)作为其中一个用户。或者与其他用户进行sudo访问并使用sudo:

sudo docker rmi [image_name_here]

这里是示例清理脚本(/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

正如Szymon Stepniak在他的回答中提到的,如果你使用的是docker&gt; = 1.13,那么选项会更简单。

cron示例(每小时20次):

20 * * * * /usr/local/bin/clean_up_docker_stuff_on_ci_agent > /dev/null 2>&1

答案 3 :(得分:0)

您遇到的错误通常是因为不允许用户使用docker cli或docker停止。

无论如何,要回答你的问题如何正确地进行清理。

  1. 确保将作业设置为定期丢弃旧版本。
  2. 如果你不能运行docker(我不知道为什么)。然后只需要一个清理Jenkins服务器/ var / lib / docker目录的cron。
  3. 最后,使用以jenkins从属身份运行的docker容器。这样,构建工件存储在临时文件系统中,如果您经常重新配置jenkins从属服务器,则不会再遇到磁盘空间问题。

答案 4 :(得分:0)

Jenkins的Docker插件在其Docker代理模板配置中为此具有一个 Remove Volumes 复选框:

Remove the volumes associated to the container during container remove.