Rootless Docker模式下如何从宿主机访问Docker volume内的文件?
非Root模式Docker卷权限问题解决方案
问题根因
你遇到的权限问题核心是容器内部运行进程的UID/GID与宿主机docker用户的UID/GID不匹配:容器挂载卷后,会自动把卷内目录的属主修改为容器内部运行用户的UID(你场景里的165605),而默认权限仅开放给属主用户,所以宿主机的docker用户没有访问权限。
可选用的解决方案
方案1:启动容器时指定运行用户为docker用户(优先推荐,无额外配置)
先在宿主机执行以下命令查询docker用户的UID和GID:
假设查询到的UID/GID为1000:1000,创建容器时增加id -u docker # 输出docker用户UID id -g docker # 输出docker用户GID--user参数指定运行用户即可:
这种方式容器内部进程会以指定UID运行,卷的属主会自动设置为对应ID,宿主机docker用户可直接访问卷内容,不影响容器运行。docker run -d -v test:/etc/myapp/directory --user 1000:1000 你的镜像名方案2:保留容器原有运行用户,通过ACL授权docker用户访问
如果镜像预设了必须用165605这个UID运行无法修改,可以用ACL给docker用户单独加访问权限,不需要改动原有文件属主:# 给对应卷的_data目录加docker用户的读写执行权限,递归所有子文件加-R参数 sudo setfacl -R -m u:docker:rwx /home/docker/.local/share/docker/volumes/test/_data # 如果是绑定挂载的场景,替换为你的宿主机挂载目录即可 sudo setfacl -R -m u:docker:rwx /home/docker/mydirectory方案3:针对绑定挂载场景开放组权限
你最初的绑定挂载目录属组已经是docker组,仅需开放组权限即可访问:sudo chmod -R g+rwx /home/docker/mydirectory
注意事项
- 执行涉及sudo的权限修改命令时,需要有宿主机的sudo权限
- 用ACL授权的方式不会影响容器内部的原有权限配置,兼容性更高
内容的提问来源于stack exchange,提问作者R2Bleep2
相关产品推荐
相关产品推荐

