微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

启动jenkins容器,但是遇到权限被拒绝,尽管我已经对该卷运行了“ chown”

如何解决启动jenkins容器,但是遇到权限被拒绝,尽管我已经对该卷运行了“ chown”

我在MacBook终端上。我尝试在本地计算机上启动并运行一个jenkins容器。

我首先创建了一个docker-compose.yml:

version: '3'
services:
  jenkins:
    container_name: jenkins
    image: jenkins/jenkins
    ports:
      - "8080:8080"
    volumes:
      - $PWD/jenkins_home:/var/jenkins_home
    networks:
      - net
networks:
  net:

您可以在volumes部分中看到,我已经将当前目录下的jenkins_home文件夹定义为jenkins数据的卷。

然后在我的计算机的当前目录下,创建了一个名为jenkins_home文件夹。这是我当前的目录:

-rw-r--r--  1 john 1349604816  220 Sep  4 00:08 docker-compose.yml
drwxr-xr-x  2 john 1349604816   64 Sep  4 00:06 jenkins_home

如您所见,我需要更改jenkins_home文件夹的所有权,以使jenkins容器能够在其中写入数据(因为uid不是1000)。因此,我执行了命令:

sudo chown 1000:1000 jenkins_home/

然后,我当前的目录如下:

-rw-r--r--  1 john  1349604816  220 Sep  4 00:08 docker-compose.yml
drwxr-xr-x  2 1000     1000         64 Sep  4 00:06 jenkins_home

此后,我通过命令docker-compose up运行容器。但是我最终出现了错误

Starting jenkins ... done
Attaching to jenkins
jenkins    | touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
jenkins    | Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
jenkins exited with code 1

在更改计算机上当前目录下的jenkins_home文件夹的所有权后,为什么仍然出现权限错误

P.S。我知道可以有其他方法来纯粹运行jenkins容器,但是我仍然想了解我的方法有什么问题,希望也可以使它工作。

解决方法

Jenkins需要创建或使用现有的jenkins_home目录,

当Docker发现您机器中的jenkins_home卷不存在时,它将使用您的osx UID & GID创建它。

如果创建jenkins_home文件夹,则必须保留当前目录权限,并且不能更改它们,

运行UID的Docker与您的计算机不同,它们可能具有different UID and GID.

Linux名称空间为运行中的进程提供了隔离,从而限制了 他们无需运行进程即可访问系统资源 意识到局限性。有关Linux名称空间的更多信息, 请参阅Linux名称空间。

从内部防止特权升级攻击的最佳方法 container是用来配置容器的应用程序以 非特权用户。对于其进程必须以 容器中的root用户,您可以将该用户重新映射到 Docker主机上的特权较低的用户。映射的用户被分配了一个 在命名空间中用作普通UID的UID范围 0到65536,但对主机本身没有特权。

精彩的video解释了docker如何与名称空间一起使用

,

Mac上是否存在实际的詹金斯用户/组? 这是我在Linux服务器上执行的操作:

ARG user=jenkins
ARG group=jenkins
ARG uid=1000
ARG gid=1000

在我的高山服务器上:

addgroup -g ${gid} ${group}
adduser -u ${uid} -G ${group} -s /bin/bash -D ${user}

成为

addgroup -g 1000 jenkins
adduser -u 1000 -G jenkins -s /bin/bash -D jenkins

在我的centos8服务器上

groupadd -g ${gid} ${group}
useradd -u ${uid} -g ${group} -s /bin/bash -d ${user}

成为

groupadd -g 1000 jenkins
useradd -u 1000 -g jenkins -s /bin/bash -d jenkins

然后:

sudo chown jenkins:jenkins jenkins_home/

我不使用Mac,但我认为它是相似的

更新 基于以上所有,请尝试以下操作: docker-compose.yml

version: '3'
services:
  jenkins:
    container_name: jenkins
    image: jenkins/jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - $PWD/jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - net
networks:
  net:

我添加了以下内容:

  • 端口50000(仅当您要附加构建从属服务器,而不是仅在主服务器上运行构建时)
  • volume /var/run/docker.sock(要在Jenkins中使用docker守护程序,您需要挂载该卷)

!!执行以下操作!:删除之前创建的原始jenkins_home目录。现在运行'docker-compose up',因为 host 卷目录不存在,docker现在将基于docker-compose.yml中的配置在主机上创建所需目录。 '$PWD/jenkins_home'),因此它现在具有jenkins容器使用它的正确所有权和权限。

如果这不起作用,请使jenkins容器以特权模式运行,请参见下文:

version: '3'
services:
  jenkins:
    container_name: jenkins
    image: jenkins/jenkins
    privileged: true
    user: root
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - $PWD/jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - net
networks:
  net:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。