无根Docker主机文件权限

dwbf0jvd  于 2024-01-06  发布在  Docker
关注(0)|答案(1)|浏览(256)

我在Ubuntu 22.04上运行Docker version 24.0.7, build afdd53b rootless。我挂载到容器读写的主机文件夹显示为有效的只读。
在主机上:

  1. $ cat /etc/group
  2. ...
  3. docker:x:999:gpeterso,mjl
  4. mjl:x:3251:gpeterso
  5. $ cat /etc/subuid
  6. gpeterso:100000:65536
  7. mjl:200000:65536
  8. $ cat /etc/subgid
  9. gpeterso:100000:65536
  10. mjl:200000:65536
  11. $ ls -al /home/gpeterso/mjl-dev/web/logs/
  12. total 8
  13. drwxrwxr-x 2 mjl mjl 4096 Dec 13 11:06 .
  14. drwxrwxr-x 8 mjl mjl 4096 Sep 29 12:59 ..

字符串
然后我启动docker容器并检查它:

  1. $ docker inspect mjl-dev-web
  2. [
  3. {
  4. ...
  5. "Driver": "overlay2",
  6. "Platform": "linux",
  7. "MountLabel": "",
  8. "ProcessLabel": "",
  9. "AppArmorProfile": "",
  10. ...
  11. "HostConfig": {
  12. "Binds": [
  13. ...
  14. "/home/gpeterso/mjl-dev/web/logs/:/usr/local/ROOT/logs/",
  15. ...
  16. ],
  17. "Mounts": [
  18. ...
  19. {
  20. "Type": "bind",
  21. "Source": "/home/gpeterso/mjl-dev/web/logs",
  22. "Destination": "/usr/local/ROOT/logs",
  23. "Mode": "",
  24. "RW": true,
  25. "Propagation": "rprivate"
  26. },
  27. ...
  28. ],
  29. "Config": {
  30. ...
  31. "User": "mjl",
  32. ...
  33. ]


然后我连接到容器并尝试访问目录:

  1. $ docker exec -it mjl-dev-web /bin/bash
  2. 5af614bba1c8:/usr/local/ROOT$ cd logs
  3. 5af614bba1c8:/usr/local/ROOT/logs$ ls -al
  4. total 8
  5. drwxrwxr-x 2 nobody nobody 4096 Dec 13 11:06 .
  6. drwxr-xr-x 1 root root 4096 Dec 13 11:20 ..
  7. 5af614bba1c8:/usr/local/ROOT/logs$ echo 'hi' >test.txt
  8. bash: test.txt: Permission denied
  9. 5af614bba1c8:/usr/local/ROOT$ whoami
  10. mjl


Docker容器显示Map的文件夹RW(读和写)。所以我假设它一定是用户混淆?为什么我Map的驱动器显示为nobody或root而不是mjl?我尝试了sudo systemctl restart docker,但我现在要重新启动。

inb24sb2

inb24sb21#

这不是混淆,这是用户名称空间的工作方式。容器中的uid/gid会根据subbuid/subgid条目进行移位。因此容器中的uid/gid 0/0会Map到主机上的200000/200000。文件系统挂载上没有uid/gid的Map,因此如果uid 200000无法写入主机上的文件,容器中的uid 0也不能写入文件。
一种解决方法是为容器根用户定义一个subbuid/subgid条目,该条目Map回您的主机用户,例如,如果mjl的uid/gid为1001,则可以添加如下条目:

  1. $ cat /etc/subuid
  2. gpeterso:100000:65536
  3. mjl:1001:1
  4. mjl:200000:65535
  5. $ cat /etc/subgid
  6. gpeterso:100000:65536
  7. mjl:1001:1
  8. mjl:200000:65535

字符串
容器中的root将Map到主机上的1001/1001。
另一种选择是在主机上添加一个用户,该用户与主机Map的uid/gid匹配,并且是可以写入文件夹的组的成员。这可能还需要在容器的/etc/group文件中使用容器uid/gid完成,我不确定内核是否在绑定挂载的两个位置都强制执行它。在这种情况下,这将涉及为mljcroot添加一个用户到主机,uid/gid 200000/200000,是mlj组的成员。

展开查看全部

相关问题