我试图以这种方式挂载目录作为Docker卷,
在容器内创建的用户可以写入
到该卷的文件中.同时,该文件应该
对容器外的用户lape至少是可读的.
本质上,我需要将用户UID从容器用户命名空间重新映射到主机用户命名空间上的特定UID.
我怎样才能做到这一点?
我更喜欢以下答案:
>不要涉及改变Docker守护进程的运行方式;
>并允许分别为每个容器配置容器用户命名空间;
>不要求重建图像;
>我会接受使用Access Control Lists显示一个很好的解决方案的答案;
建立:
这就是情况的复制方式.
我有我的linux用户lape,分配给docker组,所以我
可以运行Docker容器而不是root.
lape@localhost ~ $IDuID=1000(lape) gID=1000(lape) groups=1000(lape),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),121(lpadmin),131(sambashare),999(docker)
Dockerfile:
FROM alpineRUN apk add --update su-exec && rm -rf /var/cache/apk/*# I create a user insIDe the image which i want to be mapped to my `lape`RUN adduser -D -u 800 -g 801 insIDerVolUME /datacopY ./entrypoint.sh /entrypoint.shENTRYPOINT ["sh","/entrypoint.sh"]
entrypoint.sh:
#!/bin/shchmod 755 /datachown insIDer:insIDer /data# This will run as `insIDer`,and will touch a file to the shared volume# (the name of the file will be current timestamp)su-exec insIDer:insIDer sh -c 'touch /data/$(date +%s)'# Show permissions of created filesls -las /data
一旦构建:
docker build -t nstest
我运行容器:
docker run --rm -v $(pwd)/data:/data nstest
输出如下:
total 8 4 drwxr-xr-x 2 insIDer insIDer 4096 Aug 26 08:44 . 4 drwxr-xr-x 31 root root 4096 Aug 26 08:44 .. 0 -rw-r--r-- 1 insIDer insIDer 0 Aug 26 08:44 1503737079
所以该文件似乎是作为用户内幕创建的.
从我的主机,权限看起来像这样:
lape@localhost ~ $ls -las ./datatotal 84 drwxr-xr-x 2 800 800 4096 Aug 26 09:44 .4 drwxrwxr-x 3 lape lape 4096 Aug 26 09:43 ..0 -rw-r--r-- 1 800 800 0 Aug 26 09:44 1503737079
这表明该文件属于uID = 800(即内部用户甚至不存在于Docker命名空间之外).
我尝试过的事情:
>我尝试将–user参数指定为docker run,但似乎它只能映射主机上的哪个用户映射到docker命名空间内的uID = 0(root),在我的情况下,内部人员不是root.所以它在这种情况下并没有真正起作用.
>我从容器中实现内部(uID = 800)的唯一方法是将来自主机的lape(uID = 1000)视为添加–userns-remap =“default”到dockerd启动脚本,并添加dockremap:200:100000到文件/ etc / subuID和/ etc / subgID,如documentation for –userns-remap所示.巧合的是,这对我有用,但这还不够解决,因为:
>它需要重新配置Docker守护程序的运行方式;
>需要对用户ID进行一些算术运算:’200 = 1000 – 800′,其中1000是我的用户在主机上的UID,800是UID是内部用户;
>如果内部用户需要比我的主机用户更高的UID,那甚至都行不通;
>它只能配置全局映射用户命名空间的方式,而无法为每个容器配置唯一配置;
>这种解决方案有点工作,但实际使用有点太难看了.
添加默认acl:setfacl -d -m u:lape:-rx / data.
您还需要访问目录本身:setfacl -m u:lape:-rx / data.
这种解决方案有什么障碍吗?
总结以上是内存溢出为你收集整理的linux – 在特定的用户命名空间配置中运行每个Docker容器全部内容,希望文章能够帮你解决linux – 在特定的用户命名空间配置中运行每个Docker容器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)