Jenkins 错误的卷权限

问题描述 投票:0回答:12

我有一台托管 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"
docker jenkins virtualbox docker-compose shared-directory
12个回答
30
投票

使用 -u 参数轻松修复它。请记住,这将以 root 用户身份运行 (uid=0)

docker run -u 0 -d -p 8080:8080 -p 50000:50000 -v /data/jenkins:/var/jenkins_home jenkins/jenkins:lts

17
投票

正如 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 命令。


15
投票

问题是,您在容器中的用户与主机上的用户具有不同的 userid:groupid。

你有两种可能:

  1. 您可以确保容器中的用户与主机上的用户具有相同的 userid:groupid,可以访问挂载的卷。为此,您必须在 Dockerfile 中调整用户。在dockerfile中创建一个相同userid:groupid的用户,然后切换到这个用户https://docs.docker.com/engine/reference/builder/#user

  2. 可以确保宿主机上的用户与容器中的用户具有相同的userid:groupid。为此,使用

    docker exec -it <container-name> bash
    进入容器并显示用户 ID
    id -u <username>
    组 ID
    id -G <username>
    。把挂载卷的权限改成这个userid:groupid。


2
投票

你可能在 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。


1
投票

作为@Kiem 回复的更新,使用 $UID 确保容器使用与主机相同的用户 ID,您可以这样做:

docker run -u $UID -d -p 8080:8080 -p 50000:50000 -v /data/jenkins:/var/jenkins_home jenkins/jenkins:lts

1
投票

我刚刚添加的 Minikube/Kubernetes 也有类似的问题

securityContext:
  fsGroup: 1000
  runAsUser: 0

正在部署 -> 规范 -> 模板 -> 规范


0
投票

此错误使用以下命令解决。

转到你的詹金斯数据挂载路径:/media

运行以下命令:

cd /media
sudo chown -R ubuntu:ubuntu sf_devops-workspaces

重启 jenkins docker 容器

docker-compose restart jenkins

0
投票

在 MacOS 上有一个类似的问题,我在 Minikube/Kubenetes 上使用 helm 安装了 Jenkins,经过多次修复后,我在用于部署 jenkins 的 values.yaml 中添加了 runAsUser: 0(作为 root)。

master:
  usePodSecurityContext: true
  runAsUser: 0
  fsGroup: 0

请小心,因为这意味着您将以 root 身份运行所有命令。


0
投票

使用这个命令

$ chmod +757 /home/your-user/your-jenkins-data

0
投票

好用

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容器。


-1
投票

首先,您可以使用

echo $USER
命令验证您当前的用户 之后你可以像下面这样提到 Dockerfile 中的用户是谁(在我的例子中用户是 root) screenshot


-2
投票

我有同样的问题,它在禁用 SELINUX 后得到解决。 不建议禁用 SELINUX,因此请安装自定义 semodule 并启用它。 有用。仅更改权限在 CentOS 7 上不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.