在运行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上运行。
我尝试了其他几件事,但似乎失败了。
任何指针都会受到赞赏。
谢谢。
答案 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。
也许有人对此有更多的了解,但是现在它可以取得进展。
谢谢。