詹金斯错误的卷权限

时间:2017-05-19 09:05:36

标签: docker jenkins virtualbox docker-compose shared-directory

我有一个托管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"

9 个答案:

答案 0 :(得分:5)

问题是,容器中的用户具有不同的用户ID:groupid作为主机上的用户。

你有两种可能性:

  1. 您可以确保容器中的用户具有相同的用户ID:groupid,就像主机上的用户一样,可以访问已安装的卷。为此,您必须在Dockerfile中调整用户。使用相同的用户ID:groupid在dockerfile中创建用户,然后切换到此用户https://docs.docker.com/engine/reference/builder/#user

  2. 您可以确保主机上的用户具有相同的用户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