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

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用户身份运行,没有这两个目录的写入权限,最终触发权限拒绝报错。
解决方案

方案一:一劳永逸的启动自动修复方案(推荐)

  1. 修改你的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"]
  1. 在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 "$@"
  1. 重新构建镜像并启动容器:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:06:21