【问题标题】:Jenkins wrong volume permissionsJenkins错误的卷权限
【发布时间】:2017-10-19 08:02:06
【问题描述】:

我有一个托管 Oracle Linux 的虚拟机,我在其中安装了 Docker 并使用 docker-compose 文件创建了容器。我将 jenkins 卷放在共享文件夹下,但是在启动 docker-compose up 时,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"

【问题讨论】:

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


【解决方案1】:

问题是,您在容器中的用户与主机上的用户具有不同的 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。

【讨论】:

  • 我无法启动容器,因此我无法访问它并执行第二个解决方案.. 对于第一个解决方案,您可以添加一些有关它的详细信息吗?
  • 对于第一个解决方案,您必须构建 docker 映像。意味着您需要 Dockerfile 和复制到 Dockerfile 中的工件。如果你有这个,你可以构建图像并更改 Dockerfile。
  • @TaoufikJabbari 为什么不能启动容器?事实上,您只需要图像,甚至可以在另一台机器上启动它。您使用另一个启动命令,所以只要图像中有bash,它应该可以工作。
  • @Henry 我错过了什么或者图像就像一个类而实例是容器?因为如果我运行一个新容器,它不会影响组合中的定义,因为它们是两个不同的实例..
  • @TaoufikJabbari 不,这是正确的,但只是为了找出数字用户 ID,您不需要完全相同的容器(这是“类信息”)。
【解决方案2】:

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

【讨论】:

  • 如何在 windows 中做到这一点?
【解决方案3】:

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

转到您的詹金斯数据装载路径:/media

运行以下命令:

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

重启jenkins docker容器

docker-compose restart jenkins

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      在禁用 SELINUX 后,我遇到了同样的问题。 不建议禁用 SELINUX,所以安装自定义 semodule 并启用它。 有用。仅更改权限在 CentOS 7 上不起作用。

      【讨论】:

      • 不建议禁用 SELinux,而是对目录应用 SELinux 策略。
      【解决方案6】:

      首先您可以使用echo $USER 命令验证您的当前用户 之后,您可以像下面这样提及 Dockerfile 中的用户(在我的情况下,用户是 root) screenshot

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 在 RHEL 7.9 上工作
        【解决方案8】:

        在 MacOS 上遇到了类似的问题,经过多次修复后,我在 Minikube/Kubenetes 上使用 helm 安装了 Jenkins,在我用来部署 jenkins 的 values.yaml 中添加了 runAsUser: 0(以 root 身份)。

        master:
          usePodSecurityContext: true
          runAsUser: 0
          fsGroup: 0
        

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

        【讨论】:

        • 这实际上可能是解决方案的开始。能否在主机上创建一个与该用户具有相同 UID 和 GID 的用户,并以该用户身份运行?我不能赞成这个建议以 root 身份运行,但它似乎在正确的轨道上。
        • 是的,您可以使用任何用户。
        【解决方案9】:

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

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

        【讨论】:

          猜你喜欢
          • 2019-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-11
          • 2016-01-05
          • 2014-12-01
          相关资源
          最近更新 更多