You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker-Compose与PHP容器中mkdir权限拒绝问题求助

解决Docker中PHP执行mkdir权限拒绝问题

问题根源

Dockerfile里的chown -R www-data:www-data /var/www是在镜像构建阶段生效的,但你通过volumes挂载了宿主机的./www目录到容器内/var/www/html,挂载操作会覆盖容器内原目录的权限设置,此时容器内目录的权限实际由宿主机目录的权限决定,导致容器内的www-data用户没有读写权限。

解决方案

方法一:修改宿主机目录权限匹配容器用户

  1. 查看容器内www-data用户的UID和GID:

    docker exec -it <你的容器名称或ID> id www-data
    

    通常输出类似:uid=33(www-data) gid=33(www-data)

  2. 在宿主机上修改./www目录的所有者为对应UID/GID:

    sudo chown -R 33:33 ./www
    

    执行后重启容器,PHP即可正常创建目录。

方法二:让容器运行用户匹配宿主机用户

这种方法能避免跨环境的权限不匹配问题,更适合开发场景:

  1. 修改你的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
    
  2. 修改docker-compose.yml的build部分,传递宿主机用户的UID/GID:

    build:
        context: .
        dockerfile: Dockerfile.lamp
        args:
            HOST_UID: ${HOST_UID:-1000}
            HOST_GID: ${HOST_GID:-1000}
    
  3. 启动容器时传递宿主机当前用户的UID/GID(无需手动填写):

    HOST_UID=$(id -u) HOST_GID=$(id -g) docker-compose up -d --build
    

额外说明(Windows/macOS用户)

如果你使用Docker Desktop,需确保在「设置-资源-文件共享」中已勾选本地www目录所在的磁盘,并且共享权限设置为允许读写。

内容的提问来源于stack exchange,提问作者Mart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:15:32