通过Jenkins shell在slave上清洁Docker容器

通过Jenkins shell在slave上清洁Docker容器,shell,jenkins,docker,continuous-integration,containers,Shell,Jenkins,Docker,Continuous Integration,Containers,我们有一个场景,我们构建了一个使用多个Docker图像和容器的产品 我们的Jenkins环境构建各个组件,将它们打包到容器中,然后(通常)将它们部署到测试实例中。不幸的是,让这些测试实例保持干净已经成为我难以解决的问题 奴隶是Ubuntu14.04(可靠的塔哈尔)和Ubuntu16.04 LTS(Xenial Xerus)。Docker是这些构建的最新稳定版本(1.12.3) 假设Jenkins用户被正确地分配到从设备中,并且通过sudoers文件拥有运行Docker命令的sudo权限。用户也在

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

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

奴隶是Ubuntu14.04(可靠的塔哈尔)和Ubuntu16.04 LTS(Xenial Xerus)。Docker是这些构建的最新稳定版本(1.12.3)

假设Jenkins用户被正确地分配到从设备中,并且通过sudoers文件拥有运行Docker命令的sudo权限。用户也在
docker
组中。由于我们从通过创建的一组正在运行的容器开始,因此我们以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

我无法知道是哪个图像导致了这个页面未找到错误,是吗?或者有没有更干净的方法从我的从属机器中删除所有图像以重新开始?

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

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

docker images -qa | xargs docker rmi -f
要清理容器,您可以使用

docker ps -qa | xargs docker rm -f
这将再次强制清理所有容器,即使它们正在运行。您可以使用该参数筛选容器,即仅筛选已退出的容器

docker ps -qa --filter "status=exited" | xargs docker rm -f
spotify的人也提供了一个很好的软件包,它将为您解决这个问题

编辑
docker
现在也可以使用该命令

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


我有一台Jenkins Docker从机,在那里我构建图像并将其推送到ECR存储库。 帮助我清理从机上的所有图像和容器

  • docker图像-qa | xargs docker rmi-f
    (干净图像)
  • docker ps-qa | xargs docker rm-f
    (清洁容器)

  • 谢谢@Rik。

    您可以使用
    xargs
    (稍微慢一点)
    docker ps-qa | xargs docker rmi-f
    容器是否与图像具有相同的散列?我一直认为它们是两个独立的实体,但可能我没有仔细阅读文档。对不起,我的错误,它们是。所以这是
    docker images-qa | xargs docker rmi-f
    docker ps-qa | xargs docker rm-f
    请回答这个问题,这样我就可以接受了。它工作得很好。贴出答案。还添加了对docker gc的额外引用。应该仔细看看(对于基于debian的操作系统),这会删除容器,但不会删除用于创建容器的映像。Docker compose拉入图像以构建容器。我杀死了集装箱;这是关于保留在从属计算机上的映像的。感谢您提供此解决方案“$(docker ps-aq)”为我返回空值