在预构建的docker容器中更改用户的uid(jenkins)

Cod*_*imp 10 jenkins docker jenkins-docker

我是码头工的新手,所以如果这是一个我很想念的相当明显的过程,我会为前面的愚蠢问题道歉.

我正在使用jenkinsdocker镜像设置一个持续集成服务器.我做了一个docker pull jenkins,并创建了一个用户jenkins,允许我/var/jenkins_home将容器中的容器挂载到我的主机/var/jenkins_home(也由jenkins:jenkins用户拥有).

问题是容器似乎jenkins用uid 102 来定义用户,但是我的主机将jenkins用户设置为1002,所以当我运行它时,我得到:

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
Run Code Online (Sandbox Code Playgroud)

我只是让主机jenkins用户的uid为102 /etc/passwd,但是这个uid已经被sshd占用了.我认为解决方案是改变容器使用uid 1002,但我不知道如何.

编辑

实际上,主机上的用户102是messagebus,而不是sshd.

小智 7

请看一下我刚刚上传的docker文件:https : //github.com/bdruemen/jenkins-docker-uid-from-volume/blob/master/Dockerfile。这里的 UID 是从一个挂载的卷(主机目录)中提取的,使用

stat -c '%u' <VOLUME-PATH>
Run Code Online (Sandbox Code Playgroud)

然后将容器用户的 UID 更改为与

usermod -u <UID>
Run Code Online (Sandbox Code Playgroud)

这必须以 root 身份完成,但随后 root 权限将被删除

gosu <USERNAME> <COMMAND>
Run Code Online (Sandbox Code Playgroud)

一切都在 ENTRYPOINT 中完成,因此真正的 UID 在您运行之前是未知的

docker run -d -v <HOST-DIRECTORY>:<VOLUME-PATH> ...
Run Code Online (Sandbox Code Playgroud)

请注意,更改 UID 后,容器中的进程可能无法再访问其他一些文件,因此您可能需要一个

chown -R <USERNAME> <SOME-PATH>
Run Code Online (Sandbox Code Playgroud)

在 gosu 命令之前。

您还可以更改 GID,请参阅我在 docker 中的 Jenkins 的回答 ,可以访问主机 docker ,也许您想同时更改两者以提高安全性。


lar*_*sks 5

您可以简单地更改 中的 UID /etc/passwd,假设没有其他用户具有 UID 1002。

然后,您需要将/var/jenkins_home主机的所有权更改为 UID 1002:

chown -R jenkins /var/jenkins_home
Run Code Online (Sandbox Code Playgroud)

事实上,您甚至不需要主机jenkins上的用户来执行此操作;你可以简单地运行:

chown -R 1002 /var/jenkins_home
Run Code Online (Sandbox Code Playgroud)

即使本地没有可用的 UID 1002 的用户,这也将起作用。

另一个解决方案是基于 Jenkins 映像构建您自己的 docker 映像,该映像的ENTRYPOINT脚本如下所示:

#!/bin/sh
chown -R jenkins /var/jenkins_home 
exec "$@"
Run Code Online (Sandbox Code Playgroud)

这将(递归地)chown /var/jenkins_home 容器内指向用户使用的任何 UID jenkins(这假设您的 Docker 包含的内容以 开头,这是正确的,除非镜像历史记录中root存在指令)。USER

更新

您可以基于 ( ) jenkins 映像创建一个映像,并使用 Dockerfile 对文件执行必要的编辑。但这似乎付出了很多努力却没有多少收获。目前尚不清楚为什么要在主机上创建用户,或者是否确实需要访问主机上的 jenkins 主目录。FROM .../etc/passwdjenkins

如果您所做的只是提供数据持久性,请考虑使用数据卷容器而--volumes-from不是主机卷,因为这会将数据卷与主机隔离,这样 UID 冲突就不会造成混乱。