在预先构build的docker容器(jenkins)中更改用户的uid
我对docker工人来说是新的,所以如果这是一个相当明显的过程,那么我就会为这个愚蠢的问题道歉。
我正在build立一个使用jenkins
镜像的持续集成服务器。 我做了一个docker pull jenkins
,并创build了一个用户jenkins
,允许我将容器中的/var/jenkins_home
到我的主机的/var/jenkins_home
(也由jenkins:jenkins
用户拥有)。
问题是容器似乎用uid 102来定义jenkins
用户,但是我的主机有1002的jenkins
用户,所以当我运行它时,我得到:
docker run --name jenkins -u jenkins -p 8080 -v /var/jenkins_home:/var/jenkins_home jenkins /usr/local/bin/jenkins.sh: line 25: /var/jenkins_home/copy_reference_file.log: Permission denied
我只是简单地将主机的jenkins
用户的uid设置为/etc/passwd
102,但是这个uid已经被sshd使用了。 我认为解决scheme是改变容器来使用uid 1002,但我不知道如何。
编辑
实际上,主机上的用户102是messagebus,而不是sshd。
您可以简单地更改/etc/passwd
的UID,假设没有其他用户具有UID 1002。
然后,您需要将主机上的/var/jenkins_home
的所有权更改为UID 1002:
chown -R jenkins /var/jenkins_home
事实上,你甚至不需要主机上的jenkins
用户来做这件事。 你可以简单地运行:
chown -R 1002 /var/jenkins_home
即使在本地没有可用的UID 1002的用户,这也可以工作。
另一种解决scheme是基于Jenkins图像构build自己的泊坞窗图像,该图像具有如下所示的ENTRYPOINT
脚本:
#!/bin/sh chown -R jenkins /var/jenkins_home exec "$@"
这将recursion地将/var/jenkins_home
容器内的jenkins
用户使用的任何UID(这里假设你的Docker包含以root
身份启动,除非在图像的历史logging中有USER
指令) 。
更新
您可以使用Dockerfile(基于( FROM ...
)jenkins映像创build一个新映像,并执行必要的编辑到/etc/passwd
文件。 但是,这似乎是很多工作没有太多的收获。 目前还不清楚为什么你要在主机上创buildjenkins
用户,或者你真的需要访问主机上的jenkins主目录。
如果您所做的只是提供数据持久性,请考虑使用数据卷容器和 – --volumes-from
而不是主机卷,因为这会将数据卷与主机隔离开来,因此UID冲突不会造成混淆。
请看看我刚刚上传的docker文件: https : //github.com/bdruemen/jenkins-docker-uid-from-volume/blob/master/Dockerfile 。 这里的UID是从安装的卷(主目录)中提取的
stat -c '%u' <VOLUME-PATH>
然后将容器用户的UID更改为相同的值
usermod -u <UID>
这必须以root身份完成,但随后会删除root权限
gosu <USERNAME> <COMMAND>
一切都在进入点完成,所以真正的UID是未知的,直到你运行
docker run -d -v <HOST-DIRECTORY>:<VOLUME-PATH> ...
请注意,在更改UID之后,可能有一些其他文件不再可供容器中的进程访问,因此您可能需要一个
chown -R <USERNAME> <SOME-PATH>
在gosu命令之前。
你也可以改变GID,在这里看到我的答案jenkins在docker上访问主机docker ,也许你想改变这两个,以提高安全性。
我有同样的错误,我closuresSELinux(在CEntOS),它的工作原理。 否则,用SEManage命令调整SElinux会更好。