14

我是 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

我只需将主机jenkins用户的 uid 设为 102 in /etc/passwd,但该 uid 已被 sshd 占用。我认为解决方案是将容器更改为使用 uid 1002,但我不确定如何。

编辑

实际上,主机上的用户 102 是消息总线,而不是 sshd。

4

3 回答 3

7

请看一下我刚刚上传的 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>

一切都在 ENTRYPOINT 中完成,所以真正的 UID 在你运行之前是未知的

docker run -d -v <HOST-DIRECTORY>:<VOLUME-PATH> ...

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

chown -R <USERNAME> <SOME-PATH>

在 gosu 命令之前。

您还可以更改 GID,在此处查看我的答案 Jenkins in docker 可以访问主机 docker ,也许您想更改两者以提高安全性。

于 2015-10-05T12:36:09.647 回答
5

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

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

chown -R jenkins /var/jenkins_home

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

chown -R 1002 /var/jenkins_home

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

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

#!/bin/sh
chown -R jenkins /var/jenkins_home 
exec "$@"

这将(递归地)chown /var/jenkins_home 容器内到用户使用的任何 UID jenkins(这假设您的 Docker 包含的开头为,除非图像历史记录中有指令,root否则这是真的)。USER

更新

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

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

于 2015-08-24T15:45:32.143 回答
1

我遇到了同样的错误,我关闭了 SELinux(在 CEntOS 上)并且它可以工作。否则,最好使用 SEManage 命令调整 SElinux。

于 2015-11-23T13:56:37.953 回答