我为每个gitlab ci管道设置一个干净且封装的docker环境时遇到了一些麻烦。
我想要实现的目标:
每个管道都应该在自己的docker环境中运行。 在一个作业中启动的Docker容器应该出现在下一个阶段的作业中(使用docker executor)。
示例管道可包含以下阶段:
当我使用docker-in-docker(dind)服务的docker执行器时,每个作业都在干净的环境中运行。但这意味着在一个工作中启动的docker容器在下一个工作中无法访问。
当我使用docker socket绑定时,可以实现给定的样本管道。
但是,如果我理解一切正确,这可能会导致运行该管道的不同提交之间发生冲突。
docker套接字从主机传递,因此在管道中创建的所有docker容器也将在主机和并发管道上可用。
为了防止命名冲突,每个容器的名称可以附加预定义的gitlab环境变量CI_COMMIT_SHA
。因此,每个管道都会创建自己的可识别容器(在主机上)。
但这是一个安全问题。正如gitlab documentation所说的命令
docker rm -f $(docker ps -a -q)
在任何作业中运行都会删除管道外的所有容器,这意味着主机包括gitlab运行器容器。
我已经在gitlab文档和其他来源中阅读了很多内容,但是我找不到为整个管道设置干净且封装的docker环境的解决方案,其中容器可以在阶段之间访问但不能从外面(其他管道)。还应该保存主机的容器。
这个问题有一个干净的解决方案吗?或者至少是合理的解决方法? 在此先感谢您的支持!