【问题标题】:Cleaning Docker containers via Jenkins shell on slave通过从站上的 Jenkins shell 清理 Docker 容器
【发布时间】:2016-11-27 18:38:49
【问题描述】:

我们有一个场景,我们构建了一个使用多个 Docker 映像和容器的产品。

我们的 Jenkins 环境构建各个组件,将它们打包到容器中,然后(通常)将它们部署到测试实例。不幸的是,让这些测试实例变得干净已经成为我无法解决的问题。

奴隶是 Ubuntu 14.04 (Trusty Tahr) 和 Ubuntu 16.04 LTS (Xenial Xerus)。 Docker 是这些构建 (1.12.3) 的最新稳定版本。

假设 Jenkins 用户已正确 sshed 到从设备,并通过 sudoers 文件具有 sudo 权限以运行 Docker 命令。该用户也在docker 组中。由于我们从通过Docker Compose 创建的一组运行中的容器开始,我们将容器作为 Jenkins shell 脚本停止,并以:

docker-compose stop

然后我们删除这些容器和相关卷:

docker-compose rm -fv

现在是删除图片的时候了,因为我们要在它们的位置放置一组新图片。在这里,我的代码有所改进,但效果不佳。

我目前正在做以下事情:

dockerimagesoutput="$(sudo docker images -q | sort | uniq)"
if [ ! -z "$dockerimagesoutput" ]; then
    sudo docker rmi "${dockerimagesoutput}"
  fi

当它在奴隶上运行时,我结束了

sudo docker images -q
+ sort
+ uniq
+ dockerimagesoutput=01b1b8ea71f4
027c45033c40
0b17fb320c4f
182d60ace820
19a515d76e88
.
.
.
c10984351e73
c2c4b1989875
c95d5afc74e2
ca82cd3aa0d4
d0521df160d4
d99ef18f88fd
e01106d204cb
e0b4f8e0248d
f0a4e63c158c
f14a297b157d
f7dbb67755a8
fe35996d49e9
ff1f30708195
+ [ ! -z 01b1b8ea71f4
027c45033c40
0b17fb320c4f
182d60ace820
19a515d76e88
27f52880c6e2
2af6e3c3e3d7
.
.
.
8d6bfee5cecd
8f244f8ae3db
8f72d2d366e9
9393b391526a
97f2023dcc65
a4d2bb5d4d52
ab4148bd2fb9
aee91e3b71a7
b34b797e9fe6
b4d1c74da310
c10984351e73
c2c4b1989875
c95d5afc74e2
ca82cd3aa0d4
d0521df160d4
d99ef18f88fd
e01106d204cb
e0b4f8e0248d
f0a4e63c158c
f14a297b157d
f7dbb67755a8
fe35996d49e9
ff1f30708195 ]
+ sudo docker rmi 01b1b8ea71f4
027c45033c40
0b17fb320c4f
182d60ace820
19a515d76e88
27f52880c6e2
2af6e3c3e3d7
306ad873c7d8
3258b6beb926
4890da71db50
4aa966f33a88
4f9a28709c33
524ef9a2e9fd
549a9df5d9c4
594ea008ad1c
5ac2e713a1e6
62351a723b50
688715837b4c
.
.
.
9393b391526a
97f2023dcc65
a4d2bb5d4d52
ab4148bd2fb9
aee91e3b71a7
b34b797e9fe6
b4d1c74da310
c10984351e73
c2c4b1989875
c95d5afc74e2
ca82cd3aa0d4
d0521df160d4
d99ef18f88fd
e01106d204cb
e0b4f8e0248d
f0a4e63c158c
f14a297b157d
f7dbb67755a8
fe35996d49e9
ff1f30708195
Error response from daemon: page not found

我无法知道是哪个图片导致此页面未找到错误,是吗?还是有一种更简洁的方法可以从我的从机中删除所有图像以重新开始?

【问题讨论】:

  • 你可以使用xargs(慢一点)docker ps -qa | xargs docker rmi -f
  • 容器是否具有与图像相同的哈希值?我一直认为它们是两个独立的实体,但也许我没有足够仔细地阅读文档。
  • 对不起,我错了,他们是。所以是docker images -qa | xargs docker rmi -fdocker ps -qa | xargs docker rm -f
  • 请将此作为答案,以便我接受。效果很好。
  • 已发布答案。还添加了对 docker-gc 的额外参考。真的应该看看(对于基于 debian 的操作系统)

标签: shell jenkins docker continuous-integration containers


【解决方案1】:

为了清理图像(请注意,这将强制清理所有内容)您可以使用

docker images -qa | xargs docker rmi -f

要清理容器,您可以使用

docker ps -qa | xargs docker rm -f

这将再次强制清理所有容器,即使它们正在运行。您可以使用--filter 参数过滤容器,即仅退出容器

docker ps -qa --filter "status=exited" | xargs docker rm -f

spotify 的人还提供了一个不错的软件包,docker-gc,它将为您解决这个问题。

编辑 docker 现在也有 system prune 命令可用。

删除所有未使用的容器、卷、网络和图像(悬空和未引用)。

【讨论】:

  • 感谢您的解决方案 "$(docker ps -aq)" 为我返回 null
【解决方案2】:

我有一台 Jenkins Docker 从机,我在其中构建映像并将其推送到 ECR 存储库。 The previous commands 帮我清理了从机上的所有镜像和容器。

  1. docker images -qa | xargs docker rmi -f(干净的图片)
  2. docker ps -qa | xargs docker rm -f(干净的容器)

谢谢@Rik。

【讨论】:

    【解决方案3】:

    docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q) 呢? 如果需要 sudo,只需在 docker 之前添加即可。

    【讨论】:

    • 这会删除容器,但不会删除用于创建它的图像。 Docker-compose 引入镜像来构建容器。我已经杀死了容器;这是关于留在从机上的图像。
    猜你喜欢
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2015-09-26
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多