启动jenkins容器,但遇到权限被拒绝,尽管我已为卷运行'chown'

iq0todco  于 2023-03-01  发布在  Jenkins
关注(0)|答案(3)|浏览(176)

我在我的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文件夹的所有权后,仍然收到权限错误?
我知道可能有其他的方法可以让一个Jenkins容器运行,但我仍然想知道我的方法有什么问题,希望也能让它工作。

6ie5vjzr

6ie5vjzr1#

Jenkins需要创建或使用现有的jenkins_home目录,
当Docker看到您机器中的jenkins_home卷不存在时,它将使用osx UID & GID创建它。
如果创建jenkins_home文件夹,则必须保留当前目录权限,并且不能更改它们。
运行UID的Docker与您的计算机不同,它们可能具有different UID and GID.
Linux命名空间为正在运行的进程提供隔离,限制它们对系统资源的访问,而正在运行的进程不会意识到这些限制。有关Linux命名空间的详细信息,请参阅Linux命名空间。
防止来自容器内的权限提升攻击的最佳方法是将容器的应用程序配置为以非特权用户身份运行。对于其进程必须以root用户身份在容器内运行的容器,您可以将此用户重新Map到Docker主机上的低特权用户。Map的用户被分配了一个UID范围,该范围在命名空间内与普通UID一样起作用,范围为0到65536。但对主机本身没有特权。
有一个很棒的video解释了docker是如何处理名称空间的

u5rb5r59

u5rb5r592#

遇到了同样的问题,然后我解决了它
1.删除现有的“/var/jenkins_home”文件夹
1.重新创建文件夹“/var/jenkins_home”
1.重新运行docker运行命令,以“docker run -u root...”开头

hjzp0vay

hjzp0vay3#

Mac上是否存在实际的Jenkins用户/组?这是我在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:

相关问题