我有一台托管 Oracle Linux 的虚拟机,我在其中安装了 Docker 并使用 docker-compose 文件创建了容器。我将 jenkins 卷放在一个共享文件夹下,但是在启动 docker-compose up 时,我收到了 Jenkins 的以下错误:
詹金斯 |触摸:无法触摸“/var/jenkins_home/copy_reference_file.log”:权限被拒绝 詹金斯 |无法写入 /var/jenkins_home/copy_reference_file.log。卷权限错误? 詹金斯以代码 1
退出
这是卷声明
volumes:
- "/media/sf_devops-workspaces/dev-tools/continuous-integration/jenkins:/var/jenkins_home"
使用 -u 参数轻松修复它。请记住,这将以 root 用户身份运行 (uid=0)
docker run -u 0 -d -p 8080:8080 -p 50000:50000 -v /data/jenkins:/var/jenkins_home jenkins/jenkins:lts
正如 haschibaschi 所说,您在容器中的用户与主机上的用户具有不同的 userid:groupid。
解决这个问题的方法是在没有(有问题的)卷映射的情况下启动容器,然后在容器上运行 bash:
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 .
有了现在匹配的权限,您应该能够运行带有卷映射的原始 docker 命令。
问题是,您在容器中的用户与主机上的用户具有不同的 userid:groupid。
你有两种可能:
您可以确保容器中的用户与主机上的用户具有相同的 userid:groupid,可以访问挂载的卷。为此,您必须在 Dockerfile 中调整用户。在dockerfile中创建一个相同userid:groupid的用户,然后切换到这个用户https://docs.docker.com/engine/reference/builder/#user
可以确保宿主机上的用户与容器中的用户具有相同的userid:groupid。为此,使用
docker exec -it <container-name> bash
进入容器并显示用户 ID id -u <username>
组 ID id -G <username>
。把挂载卷的权限改成这个userid:groupid。你可能在 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。
作为@Kiem 回复的更新,使用 $UID 确保容器使用与主机相同的用户 ID,您可以这样做:
docker run -u $UID -d -p 8080:8080 -p 50000:50000 -v /data/jenkins:/var/jenkins_home jenkins/jenkins:lts
我刚刚添加的 Minikube/Kubernetes 也有类似的问题
securityContext:
fsGroup: 1000
runAsUser: 0
正在部署 -> 规范 -> 模板 -> 规范
此错误使用以下命令解决。
转到你的詹金斯数据挂载路径:/media
运行以下命令:
cd /media
sudo chown -R ubuntu:ubuntu sf_devops-workspaces
重启 jenkins docker 容器
docker-compose restart jenkins
在 MacOS 上有一个类似的问题,我在 Minikube/Kubenetes 上使用 helm 安装了 Jenkins,经过多次修复后,我在用于部署 jenkins 的 values.yaml 中添加了 runAsUser: 0(作为 root)。
master:
usePodSecurityContext: true
runAsUser: 0
fsGroup: 0
请小心,因为这意味着您将以 root 身份运行所有命令。
使用这个命令
$ chmod +757 /home/your-user/your-jenkins-data
好用
docker-compose.yml
.
Init你应该给
priviledged:true
&user:root
如下。
version: '3'
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins:lts
ports:
- "8080:8080"
- "50000:50000"
privileged: true
user: root
volumes:
- ./jenkins_home:/var/jenkins_home
restart: always
然后您将能够通过运行“
docker-compose up -d
”成功启动jenkins容器。
我有同样的问题,它在禁用 SELINUX 后得到解决。 不建议禁用 SELINUX,因此请安装自定义 semodule 并启用它。 有用。仅更改权限在 CentOS 7 上不起作用。