在预先构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会更好。