跳至主要內容

权限被拒绝

Sankgao约 465 字大约 2 分钟DevOps问题jenkinsdockers

问题

使用 /opt/jenkins_home 作为 Jenkins 服务的挂载数据目录时,权限被拒绝。

sudo docker run -d -v /opt/jenkins_home:/var/jenkins_home -u jenkins --name jenkins jenkins/jenkins:latest

报错日志如下:

docker logs jenkins

touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
INSTALL WARNING: User:  missing rw permissions on JENKINS_HOME: /var/jenkins_home
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

原因

当前 /opt/jenkins_home 目录的属主 UID 和容器中的 jenkins 用户的 UID 值不同,导致的权限拒绝。

通过以下命令查看 /opt/jenkins_home 目录的属主 UID:

$ ls -l /opt | grep jenkins_home

drwxr-xr-x 11 jenkins jenkins 4096 Apr 22 02:03 jenkins_home

$ cat /etc/passwd | grep jenkins

jenkins:x:1002:1002::/opt/jenkins_home:/bin/bash

注意

参考官网:https://github.com/jenkinsci/docker?tab=readme-ov-file#usageopen in new window

避免使用从主机上的文件夹(/opt/jenkins_home)到 /var/jenkins_home 的绑定装载,因为这可能会导致文件权限问题(在容器中使用的用户可能没有访问主机上文件夹的权限)。如果您真的需要绑定 jenkins_home,请确保容器内的 jenkins 用户可以访问主机上的目录(容器内 jenkins 用户 UID 是 1000),或者在 docker run 中使用 -u some_other_user 参数。

解决方法

解决方法 1

修改 /opt/jenkins_home 目录属主属组权限为 1000,使挂载目录权限和容器内用户权限一样。例如:

sudo chown -R 1000:1000 /ope/jenkins_home

解决方法 2

docker run 中使用 -u uid:gid 参数,指定容器内使用的用户。例如:

sudo docker run -d -u 1002:1002 --name jenkins jenkins/jenkins:latest

由于该 ID 不存在于容器内的 /etc/passwd 文件中,所以进入容器后,容器名显示为 I have no name!。例如:

sudo docker exec -it jenkins /bin/bash

I have no name!@87396e208b2e:/$

可以进入容器中,通过修改容器内 jenkins 用户 UID 和 GID 解决。例如:

sudo docker exec -it -u 0 jenkins /bin/bash

root@87396e208b2e:/$ usermod -u 1002 jenkins
root@87396e208b2e:/$ groupmod -u 1002 jenkins