GCP Cloud Run部署Laravel出现laravel.log日志文件权限被拒绝错误
问题根源
本地运行正常是因为本地容器运行的用户、文件系统权限策略和Cloud Run默认配置存在差异,核心问题是Laravel存储目录的运行时写入权限不匹配。
排查步骤
- 首先确认Cloud Run是否开启了只读根文件系统选项:开启后容器根目录不可写,日志、缓存等需要写入的目录必须挂载内存卷才能正常写入,这是该问题的最高发诱因。
- 检查Cloud Run运行时用户配置:你在Dockerfile中将www-data的UID设为1000,若Cloud Run默认使用其他UID的用户运行容器,就会没有存储目录的写入权限。
- 确认镜像内是否预创建了Laravel所需的全部存储目录:git默认不会提交空目录,若本地代码的
storage/logs、storage/framework下的子目录不存在,构建出的镜像内也没有对应目录,运行时Laravel创建目录会触发权限报错。 - 检查Dockerfile内的权限设置顺序:你现有配置中先运行composer再修改目录权限,composer以root身份运行生成的文件属主为root,若后续chown步骤未覆盖全部文件,也会导致权限异常。
解决方法
1. 修正Dockerfile配置
调整后的构建逻辑如下,移除冗余且有安全风险的777权限配置,明确运行时用户:
FROM php:8.0-apache-buster # 安装所有系统依赖并启用PHP模块 RUN apt-get update && apt-get install -y \ libpq-dev \ libzip-dev \ && rm -r /var/lib/apt/lists/* \ && docker-php-ext-install \ pdo_pgsql \ pgsql \ zip # 安装composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer # 将apache的uid和gid修改为1000 RUN usermod -u 1000 www-data && groupmod -g 1000 www-data # 修改apache站点根目录为Laravel public目录 RUN sed -i -e "s/html/html/public/g" /etc/apache2/sites-enabled/000-default.conf # 启用apache rewrite模块 RUN a2enmod rewrite # 复制源码 COPY . /var/www/html # 预创建Laravel所需的全部存储目录 RUN mkdir -p /var/www/html/storage/logs \ /var/www/html/storage/framework/sessions \ /var/www/html/storage/framework/views \ /var/www/html/storage/framework/cache \ /var/www/html/bootstrap/cache # 安装PHP依赖(生产环境移除composer update,仅用install锁定版本) RUN cd /var/www/html && \ composer install --no-interaction --optimize-autoloader --no-dev && \ composer dump-autoload --optimize # 统一设置目录权限 RUN chown -R www-data:www-data /var/www/html && \ chmod -R 755 /var/www/html/storage && \ chmod -R 755 /var/www/html/bootstrap/cache # 明确指定运行时用户,避免Cloud Run默认用户异常 USER www-data ENTRYPOINT ["/var/www/html/docker-entrypoint.sh"]
2. 调整Cloud Run配置
- 进入Cloud Run服务的「编辑并部署新修订版本」页面,切换到「容器、变量和密匙、连接、安全性」选项卡
- 若开启了只读根文件系统:
- 下拉到「卷」模块,点击「添加卷」,选择「内存中存储(tmpfs)」,自定义卷名比如
laravel-storage - 点击「挂载卷」,选择刚创建的卷,挂载路径填写
/var/www/html/storage
- 下拉到「卷」模块,点击「添加卷」,选择「内存中存储(tmpfs)」,自定义卷名比如
- 切换到「安全性」选项卡,在「要以其身份运行容器的用户」输入框中填入
1000,和Dockerfile中设置的www-data UID保持一致 - 部署新修订版本即可验证修复效果
3. 快速验证方法
若修改后仍有报错,可在docker-entrypoint.sh开头添加命令ls -la /var/www/html/storage > /proc/1/fd/1,运行后查看Cloud Run日志即可直接看到存储目录的属主、权限信息,快速定位剩余问题。
内容的提问来源于stack exchange,提问作者Abdul Munaim
相关产品推荐
相关产品推荐

