10

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

我知道在使用 Docker 时,由于遗留的文件占用了不必要的空间,因此需要进行严格的清理过程。

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

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

有人处理过这个问题或有什么建议吗?- 我真的很感激。

4

5 回答 5

8

码头工人 < 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

码头工人> = 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 守护程序是否在此主机上运行?” 问题。

于 2017-07-16T16:22:21.410 回答
3

使用下面 burnettk 提供的脚本后,似乎在运行更多构建后释放了一些空间,但我回到了同一个地方,我的 EBS 卷上没有空间。我必须添加更多存储空间并在每月账单上向 AWS 支付更多费用,这完全没有意义。

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

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

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

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

docker build --rm

希望这有帮助!

于 2017-09-27T08:31:09.663 回答
2

为了解决“无法连接到 docker docker daemon”问题,找出 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 >= 1.13,则有更简单的选项。

cron 示例(每小时 20 次):

20 * * * * /usr/local/bin/clean_up_docker_stuff_on_ci_agent > /dev/null 2>&1
于 2017-07-16T13:35:42.220 回答
2

Jenkins 的 Docker 插件在其 Docker 代理模板配置中有一个Remove Volumes复选框,用于:

在容器移除期间移除与容器关联的卷。

于 2019-06-26T12:59:48.653 回答
0

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

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

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