gpt4 book ai didi

Docker - 可以将 NFS 共享挂载到容器中,但不能挂载到容器的子目录中

转载 作者:行者123 更新时间:2023-12-02 11:16:57 28 4
gpt4 key购买 nike

我有一个具有以下属性的 NFS 共享:

  • 安装在我的主机上 /nfs/external_disk
  • 所有者用户是 test_userUID 1234
  • 群是 test_groupGID 2222
  • 权限是 750

  • 我有一个包含以下内容的小型 Dockerfile
    ARG tag=lts
    from jenkins/jenkins:${tag}

    user root

    # Create a new user and new group that matches what is on the host.
    ARG username=test_user
    ARG groupname=test_group
    ARG uid=1234
    ARG gid=2222
    RUN groupadd -g ${gid} ${groupname} && \
    mkdir -p /users && \
    useradd -l -m -u ${uid} -g ${groupname} -s /bin/bash -d /users/${username} ${username}

    user ${username}

    构建镜像(名为 custom_jenkins )后,当我运行以下命令时,容器已正确启动,我看到原始的 Jenkins homer 内容现在已复制到共享中。
    docker run -td --rm -v /nfs/external_disk:/var/jenkins_home custom_jenkins
    但是,如果我想挂载 NFS 共享的子目录,请说 ${NFS_SHARE}/jenkins_home ,然后我收到一个错误:
    docker run -td --rm -v /nfs/external_disk/jenkins_home:/var/jenkins_home custom_jenkins

    docker: Error response from daemon: error while creating mount source path '/nfs/external_disk/jenkins_home': mkdir /nfs/external_disk/jenkins_home: permission denied.



    现在,即使我尝试在启动容器之前自己创建子目录,我仍然会遇到相同的错误。即使我将子目录的权限设置为 777 .

    请注意,我以 test_user 身份运行它具有与容器中相同的 UID/GID,并且它实际上拥有 NFS 共享。

    我有一种感觉,当 docker 尝试创建一个子目录时,它会尝试将它创建为某个不同的用户(例如“docker”用户),这会导致它在创建文件夹时失败,因为它在共享中没有访问权限。

    任何人都可以帮忙吗?提前致谢。

    最佳答案

    我试图重现。对我来说很好用。也许我缺少一些约束。无论如何,希望这会有所帮助。在第 6 步注意我从容器创建的文件的所有者和组。这可能会回答您的问题之一。
    第一步:我在局域网的某个地方创建了一个 NFS 共享
    第 2 步:我在运行 docker 引擎的机器上安装了共享

    sudo mount 192.168.0.xxx:/i-data/b4024d5b/nfs/NFS /mnt/nsa320/
    neo@neo-desktop:nsa320$ mount | grep NFS
    192.168.0.xxx:/i-data/b4024d5b/nfs/NFS on /mnt/nsa320 type nfs (rw,relatime,vers=3,rsize=32768,wsize=32768,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.0.xxx,mountvers=3,mountport=3775,mountproto=udp,local_lock=none,addr=192.168.0.xxx)
    第 3 步:我创建了一些示例文件和一个子目录:
    neo@neo-desktop:nsa320$ ls -la /mnt/nsa320/
    total 12
    drwxrwxrwx 3 root root 4096 Jul 21 22:54 .
    drwxr-xr-x 3 root root 4096 Jul 21 22:41 ..
    -rw-r--r-- 1 neo neo 0 Jul 21 22:45 dummyFile
    -rw-r--r-- 1 root root 0 Jul 21 22:53 fileCreatedFromContainer << THIS WAS CREATED FROM A CONTAINER THAT WAS NOT LAUNCHED WITH THE --user OPTION
    drwxr-xr-x 2 neo neo 4096 Jul 21 22:54 subfolder

    第 4 步:启动一个虚拟容器并挂载子目录(在我的操作系统中,1000 是用户 neo 的 UID):
    docker run -d -v /mnt/nsa320/subfolder:/var/externalMount --user 1000 alpine tail -f /dev/null
    第 5 步:在容器中连接以检查安装(我可以在位于 NFS 上的子文件夹中读写)
    neo@neo-desktop:nsa320$ docker exec -ti ded1dc79773e sh
    / $ ls /var/externalMount/
    fileInSubfolder
    / $ touch /var/externalMount/fileInSubfolderCreatedFromContainer
    第 6 步:回到主机上,我从容器中创建的文件属于谁:
    neo@neo-desktop:nsa320$ ls -la /mnt/nsa320/subfolder/
    total 8
    drwxr-xr-x 2 neo neo 4096 Jul 21 23:23 .
    drwxrwxrwx 3 root root 4096 Jul 21 22:54 ..
    -rw-r--r-- 1 neo neo 0 Jul 21 22:54 fileInSubfolder
    -rw-r--r-- 1 neo root 0 Jul 21 23:23 fileInSubfolderCreatedFromContainer
    也许跑题了 :在容器中执行的 whoami 仅返回 UID:
    $ whoami
    whoami: unknown uid 1000

    关于Docker - 可以将 NFS 共享挂载到容器中,但不能挂载到容器的子目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59400044/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com