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 ,也许您想同时更改两者以提高安全性。
您可以简单地更改 中的 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 冲突就不会造成混乱。
| 归档时间: |
|
| 查看次数: |
7480 次 |
| 最近记录: |