Laravel 9 Docker部署时laravel.log文件Permission denied报错
问题根因
- 你在Dockerfile中执行
chown命令时处于镜像构建阶段,此时你还没有将Laravel代码复制进镜像,/var/www/storage、/var/www/bootstrap/cache两个目录根本不存在,自然会触发「directory doesn't exist」错误。 - 你通过volume将Windows本地的
../src目录绑定挂载到容器的/var/www路径,镜像构建阶段对/var/www路径做的所有权限修改,都会在容器启动时被挂载的本地目录覆盖,完全不生效。 - 你在容器内执行Composer安装Laravel时默认使用root用户身份,生成的
storage、bootstrap/cache目录归属root用户,而php-fpm的工作进程以www-data用户身份运行,没有这两个目录的写入权限,最终触发权限拒绝报错。
解决方案
方案一:一劳永逸的启动自动修复方案(推荐)
- 修改你的Dockerfile内容如下:
FROM php:8.0.2-fpm # 安装系统依赖 RUN apt-get update && apt-get install -y \ git \ curl \ zip \ unzip # 安装PHP扩展 RUN docker-php-ext-install pdo_mysql # 安装Composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer WORKDIR /var/www # 配置启动入口脚本 COPY entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] CMD ["php-fpm"]
- 在Dockerfile同级目录下新建
entrypoint.sh文件,写入以下内容:
#!/bin/bash # 容器启动时自动修正Laravel所需目录的权限,兼容Windows挂载卷场景 chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache chmod -R 775 /var/www/storage /var/www/bootstrap/cache # 执行原有启动命令 exec "$@"
- 重新构建镜像并启动容器:
docker-compose build --no-cache php docker-compose up -d
这个方案会在每次php容器启动时自动重置两个目录的权限,不会因为重新创建容器、新增生成文件反复出现权限问题。
方案二:临时快速修复
如果你不想调整镜像配置,可以直接进入运行中的php容器执行一次权限修正命令:
docker exec -it jaynesis-php chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache docker exec -it jaynesis-php chmod -R 775 /var/www/storage /var/www/bootstrap/cache
执行完刷新页面即可正常访问,注意:这个方案在容器重建、或者重新安装Laravel后会失效,需要重新执行命令。
避坑说明
- 不要在Dockerfile构建阶段修改挂载目录的权限:绑定挂载的目录是在容器启动阶段才映射进容器的,构建阶段做的任何权限修改都会被覆盖,完全无效。
- Windows环境下使用Docker Desktop绑定挂载NTFS目录时,不需要特意修改www-data的uid/gid,只要目录归属www-data、权限设置为775即可正常读写。
内容的提问来源于stack exchange,提问作者Morri
相关产品推荐
相关产品推荐

