【问题标题】:How to map volume for Jenkins in Dockers如何在 Docker 中为 Jenkins 映射卷
【发布时间】:2020-07-26 11:55:43
【问题描述】:

我一直在尝试将卷从我的主机映射到 docker 容器,同时运行 jenkins,但失败了。

这是我迄今为止尝试过的:

我执行了以下命令:

docker run -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home jenkins/jenkins:lts

我收到以下错误:

touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

我尝试了很多东西,最后我按照此链接中的以下步骤操作:

Jenkins wrong volume permissions

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 .

在我的机器上我没有用户 1000,所以我尝试创建它但没有这样做。

useradd -u 1000 jenkins

当我运行上述命令时,出现以下错误。

useradd:UID 1000 不是唯一的

我的机器详情如下:

NAME="CentOS Linux"
VERSION="7 (Core)"

操作系统在 Oracle VM Virtual Box 上运行。

我尝试了其他一些方法,但似乎都失败了。

任何指针将不胜感激。

谢谢。

【问题讨论】:

    标签: linux docker jenkins


    【解决方案1】:

    tl;dr:您不需要在主机上添加 id 为 1000 的用户 jenkinschown 就足够了。

    权限不匹配是您在使用绑定挂载时经常遇到的常见问题。在容器内运行进程的用户与其尝试访问的绑定挂载权限不匹配。

    您可以尝试以允许访问绑定挂载的主机用户身份运行容器,即作为当前主机用户docker run --user $(id -u):$(id -g) ...

    再一次,图像中可能设置了一个特定的用户来运行一个进程,这个技巧不起作用。如果您选择继续使用绑定挂载,您可以像以前一样更改绑定挂载的权限,即chown -R 1000:1000 .。您的主机系统上不需要该用户,它应该仍然可以工作,它只会在主机上显示为用户 1000,gid 为 1000,而没有附加命名用户。

    我建议习惯于使用命名挂载而不是绑定挂载,它可以解决您使用绑定挂载时遇到的很多麻烦。

    【讨论】:

    • 如果我做chown -R 1000:1000 jenkins_home2,然后ll,我得到以下输出。 drwxr-xr-x. 2 osboxes osboxes 4096 Jul 26 04:10 jenkins_home2 似乎使用 osboxes 的 id 为 1000,我仍然遇到同样的问题。用户必须是 id 为 1000 的 jenkins。如果是,我该怎么做。
    • 主机上显示的用户映射无关紧要。 jenkins_home2 - 你用-v /var/jenkins_home2:/var/jenkins_home 启动你的容器,对吧?因为2 与您的示例不同。
    • 我仍然无法让它工作。正如您在上面的 cmets 中看到的,我几乎尝试了所有方法。
    【解决方案2】:

    我做了更多的 RnD 并尝试了以下操作:

    我运行了以下命令

    docker volume create jenkins_volume

    这会在以下目录中创建一个卷 jenkins_volume

    var/lib/docker/volumes

    如果我做ll,我会得到以下详细信息

    drwxr-xr-x. 3 root root 4096 Jul 26 07:51 jenkins_volume

    即用户和组是 root。

    现在,如果我尝试运行此命令,它工作正常。

    docker run -p 8080:8080 -p 50000:50000 -v jenkins_volume:/var/jenkins_home jenkins/jenkins:lts
    

    虽然我不清楚为什么之前它不起作用(如在原始问题中),即使 id 和 group 是 root:root for /var/jenkins_home

    可能有人对此有所了解,但现在它能够取得进展。

    谢谢。

    【讨论】:

    • 命名卷/挂载是我已经提到的更好的方法,您不会遇到主机和容器文件系统之间权限不匹配的问题。您最初的问题的原因可能只是您的虚拟机设置有些奇怪,很难说。
    【解决方案3】:

    我也遇到了这个问题,我将使用不同的目录路径来避免这个答案中的歧义。 例如。 -v /var/host/jenkins_home:/var/jenkins_home

    首先我想重现错误并在我的主机上使用sudo -u root mkdir -p /var/host/jenkins_home 创建目录。由于该目录是由root 创建的,因此只有root 有权访问它。

    $ ls -al /var/host/jenkins_home/
    total 8
    drwxr-xr-x 2 root root 4096 Jul 27 03:54 .
    drwxr-xr-x 3 root root 4096 Jul 27 03:54 ..
    

    当我现在启动 jenkins 时,我会遇到和你一样的错误

    $ docker run -p 8080:8080 -p 50000:50000 -v /var/host/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
    Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
    touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
    

    要解决此问题,您必须更改 主机文件系统 的权限,以便 uid 1000 和 gid 1000 可以访问 /var/host/jenkins_home

    sudo chown -R 1000:1000 /var/host/jenkins_home/
    

    如果我现在启动 jenkins,它将起作用:

    $ docker run -p 8080:8080 -p 50000:50000 -v /var/host/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
    Running from: /usr/share/jenkins/jenkins.war webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
    2020-07-27 03:51:36.430+0000 [id=1]     INFO  org.eclipse.jetty.util.log.Log#initialized: Logging initialized @441ms to org.eclipse.jetty.util.log.JavaUtilLog
    2020-07-27 03:51:36.577+0000 [id=1]     INFO  winstone.Logger#logInternal: Beginning extraction from war file
    

    使用 docker 时,您应该考虑 uid 和 gid 而不是用户名,因为它们可能不同并导致混淆。

    例如在我的主机上,uid 1000 是我的用户 rene

     $ id -un 1000
     rene
    

    但在容器中是jenkins:

     $ docker exec <CONTAINER_NAME> id -un 1000
     jenkins
    

    编辑

    我仍然遇到同样的错误

    检查容器中的权限

    docker run --rm -v /var/host/jenkins_home:/var/jenkins_home jenkins/jenkins:lts ls -al /var/jenkins_home
    

    它应该告诉你jenkins/var/jenkins_home 的所有者和组

    total 12
    drwxr-xr-x 2 jenkins jenkins 4096 Jul 27 04:56 .
    drwxr-xr-x 1 root    root    4096 Jul 15 14:56 ..
    -rw-r--r-- 1 jenkins jenkins  100 Jul 27 04:56 copy_reference_file.log
    

    编辑

    是的。我在虚拟机中运行 docker,对。而且VM主机也是linux的。我是码头工人的新手,所以不太了解您在这里所说的内容。能不能详细点。

    所以你有以下设置:

    +-------------------------------------------------------------------------------+
    +                                VM  Host                                       | 
    +-------------------------------------------------------------------------------+
    |                                                                               |
    |                           +-------------------------------------------------+ |
    | /                         |           VM (Docker Host)                      | |
    | +- var                    +-------------------------------------------------+ |
    |    +- ...                 | /                      +-----------------------+| |
    |                           | +- var                 |   container jenkins   || |
    |                           |    +- host             +-----------------------+| |
    |                           |       + -jenkins_home  |/                      || |
    |                           | /                      |+- var                 || |
    |                           |                        |   +- jenkins_home     || |
    |                           |                        +-----------------------+| |
    |                           +-------------------------------------------------+ |
    +-------------------------------------------------------------------------------+
    

    请确保您在 docker 主机(VM)上运行命令。请记住,docker 主机文件系统与您的本地(VM 主机)不同。

    【讨论】:

    • 我尝试如下:sudo -u root mkdir -p /var/host/jenkins_home 然后ls -al /var/host/jenkins_home/ 然后sudo chown -R 1000:1000 /var/host/jenkins_home/ 然后docker run -p 8080:8080 -p 50000:50000 -v /var/host/jenkins_home:/var/jenkins_home jenkins/jenkins:lts 我仍然得到同样的错误:touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions? 机器详细信息:NAME="CentOS Linux" VERSION="7 (Core)" 操作系统在 Oracle VM Virtual Box 上运行。
    • 我更新了我的答案。请检查容器中的权限。
    • 我无法执行命令docker run --rm -v /var/host/jenkins_home:/var/jenkins_home jenkins/jenkins:lts ls -al /var/jenkins_home。我得到同样的错误。如果我执行以下命令less /etc/passwd | grep 1000,我会得到以下输出:osboxes:x:1000:1000:osboxes.org:/home/osboxes:/bin/bash 1000 映射到用户 osboxes。
    • 您在虚拟机中运行 docker,对吗?而且VM主机也是linux的?如果是这样就不能在VMs docker容器中挂载VM hosts目录,因为VMs docker容器会挂载docker主机的目录,也就是VM。
    • 我的意思是:“你有 3 个独立的文件系统吗?” -> VM 主机、VM(docker 主机)、docker 容器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2017-12-09
    相关资源
    最近更新 更多