我有一个工作流程如下将webapps发布到我的开发服务器.服务器有一个docker主机,我使用docker-compose来管理容器.
>将我的应用程序中的更改推送到私有gitlab(在docker中运行).该应用程序包括一个Dockerfile和docker-compose.yml
> Gitlab触发一个jenkins构建(jenkins也在docker中运行),它执行一些正常的构建(例如运行测试)
> Jenkins然后需要建立一个新的码头图像,并使用docker-compose进行部署.
我在第3步中遇到的问题是,我设置的方式,jenkins容器可以访问主机停靠站,以便在构建脚本中运行任何docker命令与在主机上运行的Docker命令基本相同.这是使用以下DockerFile for 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容器:
-v /var/run/docker.sock:/var/run/docker.sock
-v /usr/bin/docker:/usr/bin/docker
jenkins中的典型构建脚本看起来像这样:
docker-compose build
docker-compose up
这可以正常工作,但有两个问题:
真的感觉像一个黑客但是我发现的唯一其他选项是使用docker插件进行jenkins,发布到注册表,然后让某些方式让主机知道需要重新启动.这是相当多的移动部件,docker-jenkins插件要求docker主机是在一个开放的端口,我真的不想暴露.
> jenkins DockerFile包括groupadd -g 997 docker,需要让jenkins用户访问docker.但是,GID(997)是主机上的GID,因此不可移植.
我不确定我正在寻找什么解决方案.我看不到任何实际的方法来解决这个问题,但是如果有一种方法允许在jenkins容器中运行docker命令,而不必在DockerFile中硬编码GID,那将是很好的.有人对此有任何建议吗?
这并不影响安全性,因为docker特权与sudo权限有效地相当.