我有一个发布Web应用程序到我的开发服务器的工作流程,服务器只有一个Docker宿主机,并且我使用docker-compose来管理容器。
- 将我的应用程序更改推送到私有的GitLab(在Docker中运行)。该应用程序包含Dockerfile和docker-compose.yml文件。
- GitLab触发Jenkins构建(Jenkins也在Docker中运行),进行一些常规构建操作(例如运行测试)。
- Jenkins需要使用docker-compose构建新的Docker镜像并部署它。这是我遇到的问题所在:按照我设置的方式,Jenkins容器可以访问宿主机的Docker,因此在构建脚本中运行任何
docker
命令实际上与在宿主机上运行相同。这是使用以下DockerFile为Jenkins完成的:FROM jenkins USER root # Give jenkins access to docker RUN groupadd -g 997 docker RUN gpasswd -a jenkins docker # Install docker-compose RUN curl -L https://github.com/docker/compose/releases/download/1.2.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose RUN chmod +x /usr/local/bin/docker-compose USER jenkins
并将以下卷映射到Jenkins容器:
一个典型的Jenkins构建脚本大致如下:-v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker
docker-compose build docker-compose up
这个方法可以正常运行,但有两个问题:
它感觉像是一个hack。但我发现唯一的其他选择是使用Jenkins的Docker插件,将其发布到注册表,然后有一种方法让主机知道它需要重新启动。这样涉及到的部分更多,而且docker-jenkins插件要求Docker主机在开放端口上,这并不是我真正想要暴露的。
Jenkins DockerFile包含
groupadd -g 997 docker
,这是为了让Jenkins用户访问Docker所需的。但是,GID(997)是主机上的GID,因此不可移植。
我真的不确定我在寻找什么解决方案。我看不出有任何实际的方法可以避免这种方法,但如果有一种方式可以允许在Jenkins容器内运行docker命令,而无需在DockerFile中硬编码GID,那将是很好的。有人对此有什么建议吗?