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

更改用户';预构建docker容器中的uid(jenkins),jenkins,docker,jenkins-docker,Jenkins,Docker,Jenkins Docker,我是docker的新手,所以如果这是一个我错过的相当明显的过程,我为这个愚蠢的问题道歉 我正在使用jenkinsdocker映像设置一个持续集成服务器。我做了一个docker拉jenkins,并创建了一个用户jenkins,允许我将容器中的/var/jenkins_home装载到主机的/var/jenkins_home(也归jenkins:jenkins用户所有) 问题是,容器似乎用uid 102定义了jenkins用户,但我的主机将jenkins用户设置为1002,因此当我运行它时,我得到:

我是docker的新手,所以如果这是一个我错过的相当明显的过程,我为这个愚蠢的问题道歉

我正在使用
jenkins
docker映像设置一个持续集成服务器。我做了一个
docker拉jenkins
,并创建了一个用户
jenkins
,允许我将容器中的
/var/jenkins_home
装载到主机的
/var/jenkins_home
(也归
jenkins:jenkins
用户所有)

问题是,容器似乎用uid 102定义了
jenkins
用户,但我的主机将
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
我只需在
/etc/passwd
中将主机的
jenkins
用户的uid设置为102,但该uid已经被sshd使用。我认为解决方案是将容器改为使用UID1002,但我不确定如何使用

编辑


实际上,主机上的用户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可用的用户,这也会起作用

另一个解决方案是基于Jenkins图像构建您自己的docker图像,该图像具有一个
入口点
脚本,该脚本类似于:

#!/bin/sh
chown -R jenkins /var/jenkins_home 
exec "$@"
这将(递归地)将容器内的
chown
/var/jenkins_home添加到
jenkins
用户使用的任何UID(这假设Docker包含的内容以
根目录开始,这是真的,除非图像历史记录中有
user
指令)

更新

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


如果您所做的是提供数据持久性,请考虑使用数据卷容器和<代码> -<代码>卷,而不是主机卷,因为这会将数据卷与主机隔离,因此UID冲突不会引起混淆。

< P>请看我刚刚上传的DOCKER文件: . 在这里,UID是从装载的卷(主机目录)中提取的,带有

stat-c“%u”
然后,容器用户的UID将更改为与相同的值

usermod -u <UID>
usermod-u
这必须以root身份完成,但随后root权限将随

gosu <USERNAME> <COMMAND>
gosu
所有操作都是在入口点完成的,因此在运行之前,真正的UID是未知的

docker run -d -v <HOST-DIRECTORY>:<VOLUME-PATH> ...
docker运行-d-v:。。。
请注意,更改UID后,容器中的进程可能无法再访问其他一些文件,因此您可能需要

chown -R <USERNAME> <SOME-PATH>
chown-R
在gosu命令之前

您也可以更改GID,请参见我的答案
也许你想同时更改这两个选项以提高安全性。

我也犯了同样的错误,我关闭了SELinux(在CEntOS上),它可以正常工作。
否则,最好使用SEManage命令优化SElinux。

问题在于映像使用的uid是102,这是主机获取的。如何更改容器中用户的uid?不要关闭SELinux,而是使用--privileged选项运行docker。例如:docker run——名字jenkins-d-p8080:8080-p50000:50000-v/home/jenkins:/var/jenkins_home-u1001——特权jenkins这似乎是目前为止最好的答案。关心容器的UID的原因是与主机文件系统交互,所以这很好,从装入的卷中获取UID并执行必要的操作。
chown -R <USERNAME> <SOME-PATH>