我正在运行一个jenkins docker容器,我需要从中构建并运行docker。使用-v /var/run/docker.sock:/var/run/docker.sock
启动容器。
问题是当jenkins(来自容器内部)试图使用它时,我被拒绝访问。
这是我迄今为止没有运气的尝试:
-G jenkins
参数启动docker守护程序,以便套接字由jenkins组而不是docker组拥有。 Jenkins正在与一个jenkins用户一起执行,该用户属于容器内的jenkins组。唯一有效的是" hack"我根本不喜欢:我已经修改了容器内jenkins组的id,以匹配docker.sock
的组ID。
任何关于如何以更优雅的方式解决这个问题的建议都将不胜感激。
答案 0 :(得分:4)
这听起来像是一个基本的Unix权限问题。要访问文件(或套接字),您需要(a)为root或(b)具有允许您根据文件模式进行访问的数字UID或GID。
如果你在容器内运行某些东西并且希望它能够访问主机上的某些东西,那么你将不得不以root身份运行容器内的东西,或者你将不得不解决这个问题。主机和容器之间的/ gid同步。
处理后一个问题的一种方法是在启动容器时传入目标GID,然后在启动CMD之前设置ENTRYPOINT脚本以建立适当的用户/组。类似的东西:
pattern=".*\d.*"
答案 1 :(得分:0)
我有类似的问题,最后只给了jenkins用户无密码的sudo权限。这意味着我必须使用sudo为所有docker命令添加前缀,但它可以在主机之间移植。
答案 2 :(得分:0)
你可以用jenkins用户创建一个特殊的图像,其中包含了Docker GID。这可能被称为坏,因为它不可移植:
FROM jenkins
USER root
RUN groupadd -g 999 hostdocker && usermod -G hostdocker -a jenkins
RUN wget https://get.docker.io/builds/Linux/x86_64/docker-1.7.1 -O /usr/local/bin/docker && chmod +x /usr/local/bin/docker
USER jenkins
ENTRYPOINT ["/bin/tini", "--", "/usr/local/bin/jenkins.sh"]