我有一个托管Oracle Linux的虚拟机,我已经安装了Docker并使用docker-compose文件创建了容器。我将jenkins卷放在一个共享文件夹下,但是当启动docker-compose时,我得到了Jenkins的以下错误:
詹金斯|触摸:无法触摸'/var/jenkins_home/copy_reference_file.log':权限被拒绝 詹金斯|无法写入/var/jenkins_home/copy_reference_file.log。错误的卷权限? jenkins退出代码1
这是卷声明
volumes:
- "/media/sf_devops-workspaces/dev-tools/continuous-integration/jenkins:/var/jenkins_home"
答案 0 :(得分:5)
问题是,容器中的用户具有不同的用户ID:groupid作为主机上的用户。
你有两种可能性:
您可以确保容器中的用户具有相同的用户ID:groupid,就像主机上的用户一样,可以访问已安装的卷。为此,您必须在Dockerfile中调整用户。使用相同的用户ID:groupid在dockerfile中创建用户,然后切换到此用户https://docs.docker.com/engine/reference/builder/#user
您可以确保主机上的用户具有相同的用户ID:groupid,就像容器中的用户一样。为此,请输入包含docker exec -it <container-name> bash
的容器,并显示用户ID id -u <username>
组ID id -G <username>
。将已装入卷的权限更改为此用户ID:groupid。
答案 1 :(得分:3)
正如haschibaschi所说,容器中的用户与主机上的用户具有不同的用户ID:groupid。
要解决这个问题,就是在没有(有问题的)卷映射的情况下启动容器,然后在容器上运行bash:
docker run -p 8080:8080 -p 50000:50000 -it jenkins bin/bash
进入容器的shell后,运行 id 命令,您将获得如下结果:
uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)
退出容器,转到您要映射的文件夹并运行:
chown -R 1000:1000 .
如果权限现在匹配,您应该能够使用卷映射运行原始docker命令。
答案 2 :(得分:1)
使用-u参数轻松解决。请记住,这将以root用户(uid = 0)
运行docker run -u 0 -d -p 8080:8080 -p 50000:50000 -v /data/jenkins:/var/jenkins_home jenkins/jenkins:lts
答案 3 :(得分:0)
此错误使用以下commnad解决。
转到您的jenkins数据装载路径:/ media
运行以下命令:
cd /media
sudo chown -R ubuntu:ubuntu sf_devops-workspaces
重新启动jenkins docker container
docker-compose restart jenkins
答案 4 :(得分:0)
禁用SELINUX后,我也遇到了同样的问题。 不建议禁用SELINUX,因此请安装自定义semodule并启用它。 有用。仅更改权限在CentOS 7上不起作用。
答案 5 :(得分:0)
首先,您可以使用echo $USER
命令验证当前用户
之后,您可以像下面这样提到Dockerfile中的用户是谁(在我的情况下,用户是root)
screenshot
答案 6 :(得分:0)
您可能正在使用SELinux。以特权身份运行容器为我解决了这个问题:
sudo docker run --privileged -p 8080:8080 -p 50000:50000 -v /data/jenkins:/var/jenkins_home jenkins/jenkins:lts
来自https://docs.docker.com/engine/reference/commandline/run/#full-container-capabilities---privileged:
-privileged标志为容器提供了所有功能,并且还解除了由设备cgroup控制器强制执行的所有限制。换句话说,容器可以完成主机可以做的几乎所有事情。存在此标志是为了允许特殊用例,例如在Docker中运行Docker。
答案 7 :(得分:0)
在MacOS上也有类似的问题,在我修复了许多意图之后,我在价目表中添加了runAsUser:0(以root身份)来修复它,从而在Minikube / Kubenetes上使用头盔安装了Jenkins。
7
请小心,因为这意味着您将以root用户身份运行所有命令。
答案 8 :(得分:0)
作为@Kiem 响应的更新,使用 $UID 确保容器使用与主机相同的用户 ID,您可以这样做:
docker run -u $UID -d -p 8080:8080 -p 50000:50000 -v /data/jenkins:/var/jenkins_home jenkins/jenkins:lts