Docker-Compose与PHP容器中mkdir权限拒绝问题求助
解决Docker中PHP执行mkdir权限拒绝问题
问题根源
Dockerfile里的chown -R www-data:www-data /var/www是在镜像构建阶段生效的,但你通过volumes挂载了宿主机的./www目录到容器内/var/www/html,挂载操作会覆盖容器内原目录的权限设置,此时容器内目录的权限实际由宿主机目录的权限决定,导致容器内的www-data用户没有读写权限。
解决方案
方法一:修改宿主机目录权限匹配容器用户
查看容器内
www-data用户的UID和GID:docker exec -it <你的容器名称或ID> id www-data通常输出类似:
uid=33(www-data) gid=33(www-data)在宿主机上修改
./www目录的所有者为对应UID/GID:sudo chown -R 33:33 ./www执行后重启容器,PHP即可正常创建目录。
方法二:让容器运行用户匹配宿主机用户
这种方法能避免跨环境的权限不匹配问题,更适合开发场景:
修改你的
Dockerfile.lamp,添加以下内容(放在文件末尾):# 传递宿主机用户的UID/GID参数,默认使用1000(多数Linux系统普通用户的UID) ARG HOST_UID=1000 ARG HOST_GID=1000 # 修改www-data用户的UID/GID为宿主机用户的对应值 RUN usermod -u $HOST_UID www-data && groupmod -g $HOST_GID www-data # 确保apache根目录权限正确 RUN chown -R www-data:www-data /var/www/html修改
docker-compose.yml的build部分,传递宿主机用户的UID/GID:build: context: . dockerfile: Dockerfile.lamp args: HOST_UID: ${HOST_UID:-1000} HOST_GID: ${HOST_GID:-1000}启动容器时传递宿主机当前用户的UID/GID(无需手动填写):
HOST_UID=$(id -u) HOST_GID=$(id -g) docker-compose up -d --build
额外说明(Windows/macOS用户)
如果你使用Docker Desktop,需确保在「设置-资源-文件共享」中已勾选本地www目录所在的磁盘,并且共享权限设置为允许读写。
内容的提问来源于stack exchange,提问作者Mart
相关产品推荐
相关产品推荐

