我有一个具有以下属性的NFS共享:
/nfs/external_disk
test_user
和UID 1234
test_group
和GID 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”用户)的身份创建子目录,这会导致创建文件夹失败,因为它内部没有访问权限份额。
有人可以帮忙吗?预先感谢。
答案 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