Docker-可以将NFS共享安装到容器中,但不能将其子目录安装

时间:2019-12-18 21:12:25

标签: docker containers nfs

我有一个具有以下属性的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本垒打东西现在已复制到共享中。

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:来自守护程序的错误响应:创建安装源路径'/ nfs / external_disk / jenkins_home'时出错:mkdir / nfs / external_disk / jenkins_home:权限被拒绝。

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

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

我有一种感觉,当Docker尝试创建子目录时,它会尝试以其他用户(例如“ docker”用户)的身份创建子目录,这会导致创建文件夹失败,因为它内部没有访问权限份额。

有人可以帮忙吗?预先感谢。

1 个答案:

答案 0 :(得分:2)

我试图复制。对我来说很好。也许我缺少一些约束。希望这对您有所帮助。请注意在步骤6,我从容器中创建的文件的所有者和组。这可能会回答您的问题之一。

步骤1:我在局域网中的某个地方创建了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