为每个Gitlab CI管道设置自己的Docker环境

时间:2017-08-15 21:02:59

标签: gitlab gitlab-ci gitlab-ci-runner

我为每个gitlab ci管道设置一个干净且封装的docker环境时遇到了一些麻烦。

我想要实现的目标:

每个管道都应该在自己的docker环境中运行。 在一个作业中启动的Docker容器应该出现在下一个阶段的作业中(使用docker executor)。

示例管道可包含以下阶段:

  • 启动容器(docker executor)
  • 安装一些依赖项(docker executor)
  • 运行测试(docker executor)
  • 运行其他类型的测试(docker executor)
  • 发布到docker注册表(docker executor)
  • 部署到kubernetes(Kubernetes执行者)
  • rollback kubernetes(Kubernetes executor)
  • 停止/删除容器(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环境的解决方案,其中容器可以在阶段之间访问但不能从外面(其他管道)。还应该保存主机的容器。

这个问题有一个干净的解决方案吗?或者至少是合理的解决方法? 在此先感谢您的支持!

0 个答案:

没有答案