无根Docker与Compose卷权限异常问题求助
无根Docker卷权限问题解决方案
问题背景
已配置无根(Rootless)模式Docker,整体运行正常,但挂载主机目录作为共享卷时遇到权限问题:
- 主机提前创建
wp文件夹,容器写入时提示“Permission Denied”; - 不指定
user: "1000:1000"时,容器创建的文件仅能通过sudo在主机访问。
需求:无需sudo或手动改权限,实现主机与容器对卷文件的正常访问。
相关配置:
grep ^$(whoami): /etc/subuid testuser:100000:65536
grep ^$(whoami): /etc/subgid testuser:100000:65536
对应的docker-compose.yml:
version: '3' services: wp: user: "1000:1000" image: wordpress:latest ports: - ${IP}:8000:80 volumes: - ./config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini - ./wp:/var/www/html environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_NAME: "${DB_NAME}" WORDPRESS_DB_USER: root WORDPRESS_DB_PASSWORD: "${DB_ROOT_PASSWORD}" depends_on: - db links: - db db: image: mysql:latest ports: - ${IP}:3068:3306 command: [ '--default_authentication_plugin=mysql_native_password', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci' ] volumes: - ./wp-data:/docker-entrypoint-initdb.d - db_data:/var/lib/mysql environment: MYSQL_DATABASE: "${DB_NAME}" MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
可行方案
核心是对齐容器与主机的UID/GID映射关系,以下三种方法任选:
方法1:调整主机文件夹权限(快速解决)
给主机wp文件夹添加容器映射UID的访问权限:
# 给容器映射的起始UID(100000)添加读写执行权限 setfacl -R -m u:100000:rwx ./wp # 确保新创建的文件也继承权限 setfacl -R -m d:u:100000:rwx ./wp
此方法无需修改Docker配置,容器默认以root运行即可正常访问主机目录。
方法2:修改Docker UID/GID映射(彻底对齐)
编辑~/.config/docker/daemon.json,添加映射规则让容器内UID 1000对应主机UID 1000:
{ "uidmap": [ {"container": 0, "host": 100000, "size": 1}, {"container": 1, "host": 1, "size": 999}, {"container": 1000, "host": 1000, "size": 1}, {"container": 1001, "host": 100100, "size": 64535} ], "gidmap": [ {"container": 0, "host": 100000, "size": 1}, {"container": 1, "host": 1, "size": 999}, {"container": 1000, "host": 1000, "size": 1}, {"container": 1001, "host": 100100, "size": 64535} ] }
重启Docker服务:
systemctl --user restart docker
保持docker-compose.yml中的user: "1000:1000"配置,此时容器内1000用户与主机1000用户权限完全对齐,双方读写文件无需额外权限操作。
方法3:使用Docker命名卷(规避权限问题)
替换主机目录挂载为Docker命名卷,由Docker自动管理权限:
修改docker-compose.yml的volumes部分:
services: wp: # 移除user配置或保留均可,Docker会自动处理权限 volumes: - ./config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini - wp_data:/var/www/html volumes: wp_data: db_data:
启动容器后,主机可通过docker cp操作卷内文件,或临时启动容器查看:
docker run --rm -v wp_data:/data alpine ls -l /data
此方法完全避免主机与容器的权限冲突,适合无需直接在主机编辑卷文件的场景。
内容的提问来源于stack exchange,提问作者Lucius
相关产品推荐
相关产品推荐

