如何在Dockers中映射Jenkins的卷

时间:2020-07-26 11:55:43

标签: linux docker jenkins

在运行jenkins时,我一直试图将主机中的卷映射到docker容器,但是失败。

这是我到目前为止尝试过的:

我执行了以下命令:

docker run -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home jenkins/jenkins:lts

我遇到以下错误:

touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

我尝试了很多事情,最后我通过此链接执行了以下步骤:

Jenkins wrong volume permissions

docker run -p 8080:8080 -p 50000:50000 -it jenkins bin/bash

一旦在容器的外壳中运行id命令,您将得到如下结果:

uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)

退出容器,转到您要映射的文件夹并运行:

chown -R 1000:1000 .

在我的计算机上,我没有用户1000,因此我尝试创建它,但没有这样做。

useradd -u 1000 jenkins

运行上面的命令时,出现以下错误。

用户添加:UID 1000不是唯一

我的机器详细信息如下:

NAME="CentOS Linux"
VERSION="7 (Core)"

操作系统正在Oracle VM Virtual Box上运行。

我尝试了其他几件事,但似乎失败了。

任何指针都会受到赞赏。

谢谢。

3 个答案:

答案 0 :(得分:1)

tl; dr:您不需要在主机上添加ID为1000的用户 jenkins chown 就足够了。

特权不匹配是使用绑定安装时经常遇到的常见问题。在容器内运行进程的用户与它尝试访问的绑定安装特权不匹配。

您可以尝试以允许访问绑定安装的主机用户身份运行容器,即以当前主机用户docker run --user $(id -u):$(id -g) ...

然后再次可能在图像中设置了特定的用户来运行进程,并且此技巧不起作用。如果选择继续使用绑定安装,则可以像已经进行的操作一样更改绑定安装的权限,即chown -R 1000:1000 .。您不需要主机系统上的该用户,它仍然可以工作,它将在主机上显示为gid 1000的用户1000,而未连接命名用户。

我建议习惯于使用命名安装而不是绑定安装,它可以解决使用绑定安装时遇到的许多麻烦。

答案 1 :(得分:1)

我也遇到了这个问题,我将使用不同的目录路径来避免此答案中的歧义。 例如。 -v /var/host/jenkins_home:/var/jenkins_home

首先,我想重现错误,并使用sudo -u root mkdir -p /var/host/jenkins_home在主机上创建目录。由于该目录是由root创建的,因此只有root有权访问它。

$ ls -al /var/host/jenkins_home/
total 8
drwxr-xr-x 2 root root 4096 Jul 27 03:54 .
drwxr-xr-x 3 root root 4096 Jul 27 03:54 ..

当我现在开始詹金斯时,我会得到和你一样的错误

$ docker run -p 8080:8080 -p 50000:50000 -v /var/host/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied

要解决此问题,您必须更改主机文件系统的权限,以便uid 1000和gid 1000可以访问/var/host/jenkins_home

sudo chown -R 1000:1000 /var/host/jenkins_home/

如果我现在开始使用詹金斯,它将可以工作:

$ docker run -p 8080:8080 -p 50000:50000 -v /var/host/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
Running from: /usr/share/jenkins/jenkins.war webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
2020-07-27 03:51:36.430+0000 [id=1]     INFO  org.eclipse.jetty.util.log.Log#initialized: Logging initialized @441ms to org.eclipse.jetty.util.log.JavaUtilLog
2020-07-27 03:51:36.577+0000 [id=1]     INFO  winstone.Logger#logInternal: Beginning extraction from war file

与docker合作时,您应该考虑uid和gid而不是用户名,因为它们可能会有所不同并导致混乱。

例如在我的主机上,uid 1000是我的用户rene

 $ id -un 1000
 rene

但是在容器中它是jenkins

 $ docker exec <CONTAINER_NAME> id -un 1000
 jenkins

编辑

我仍然遇到相同的错误

检查容器中的权限

docker run --rm -v /var/host/jenkins_home:/var/jenkins_home jenkins/jenkins:lts ls -al /var/jenkins_home

它应该向您显示jenkins/var/jenkins_home的所有者和组

total 12
drwxr-xr-x 2 jenkins jenkins 4096 Jul 27 04:56 .
drwxr-xr-x 1 root    root    4096 Jul 15 14:56 ..
-rw-r--r-- 1 jenkins jenkins  100 Jul 27 04:56 copy_reference_file.log

编辑

是的。我正在VM内运行docker,对。 VM主机也是linux。我是Docker的新手,所以对您在这里所说的内容不太了解。您能详细说明一下吗?

因此您具有以下设置:

+-------------------------------------------------------------------------------+
+                                VM  Host                                       | 
+-------------------------------------------------------------------------------+
|                                                                               |
|                           +-------------------------------------------------+ |
| /                         |           VM (Docker Host)                      | |
| +- var                    +-------------------------------------------------+ |
|    +- ...                 | /                      +-----------------------+| |
|                           | +- var                 |   container jenkins   || |
|                           |    +- host             +-----------------------+| |
|                           |       + -jenkins_home  |/                      || |
|                           | /                      |+- var                 || |
|                           |                        |   +- jenkins_home     || |
|                           |                        +-----------------------+| |
|                           +-------------------------------------------------+ |
+-------------------------------------------------------------------------------+

请确保您在docker主机(VM)上运行命令。请记住,Docker主机文件系统与本地(VM主机)不同。

答案 2 :(得分:0)

我做了一些RnD并尝试了以下操作:

我运行了以下命令

func (it *objectItMock) Next() (a *storage.ObjectAttrs, err error) { if it.i == len(it.next) { err = iterator.Done return } a = &it.next[it.i] it.i += 1 return } func (m bucketMock) Objects(ctx context.Context, q *storage.Query) (it stiface.ObjectIterator) { it = &objectItMock{ i: 0, next: []storage.ObjectAttrs{ {Name: "abc"}, {Name: "def"}, {Name: "ghi"}, }, } return }

这将在以下目录中创建一个卷jenkins_volume

docker volume create jenkins_volume

如果我做var/lib/docker/volumes,则会得到以下详细信息

ll

即用户和组是root。

现在,如果我尝试运行此命令,它将运行正常。

drwxr-xr-x. 3 root root  4096 Jul 26 07:51 jenkins_volume

尽管我不清楚我为什么为什么以前不起作用(就像原始问题一样),即使id和group是root:docker run -p 8080:8080 -p 50000:50000 -v jenkins_volume:/var/jenkins_home jenkins/jenkins:lts 的root。

也许有人对此有更多的了解,但是现在它可以取得进展。

谢谢。

相关问题