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

使用Docker、Nginx部署Grav站点时遭遇权限问题求助

解决Docker环境下Grav站点的权限问题

看起来你遇到的核心问题是容器内用户权限不匹配,导致Grav无法创建缓存目录。让我一步步帮你排查和解决:

问题根源

你的Nginx容器使用的是nginx用户(Alpine镜像中UID默认是101),而PHP-FPM容器默认使用www-data用户(UID默认是33)。当你挂载本地./src目录到两个容器后,文件的所有者要么是主机用户,要么是Nginx容器构建时复制的nginx:nginx,但PHP进程(www-data)没有权限写入这些目录,所以才会出现创建cache目录失败的错误。

另外,你的Nginx Dockerfile里的COPY ./src .是多余的——因为你已经通过volumes挂载了本地./src到容器的/var/www/html,构建时复制的文件会被挂载的卷完全覆盖,这一步不仅没用,还可能提前引入权限问题。

解决方案:统一容器用户UID

最彻底的解决方法是让Nginx和PHP容器使用相同的用户UID,这样两个进程对挂载目录的权限会保持一致。这里我们选择把Nginx的nginx用户UID改成和PHP的www-data一致(UID=33):

1. 修改Nginx Dockerfile

更新你的./docker/nginx/Dockerfile:

FROM nginx:stable-alpine
# 将nginx用户的UID改为33,匹配PHP的www-data用户
RUN sed -i 's/nginx:x:101:101:/nginx:x:33:33:/' /etc/passwd
WORKDIR /var/www/html
# 移除多余的COPY ./src .,因为卷挂载会覆盖这个目录
COPY ./docker/nginx/default.conf /etc/nginx/conf.d/default.conf

2. 调整本地目录权限(可选但推荐)

在你的Digital Ocean Droplet上,给本地src目录设置正确的权限,让容器内的用户(UID=33)能读写:

sudo chown -R 33:33 ./src

如果不想修改主机用户权限,也可以跳过这一步,直接通过容器启动命令临时调整,但上面的方法更持久。

3. (可选)快速验证的临时方案

如果不想修改Dockerfile,可以在PHP容器的启动命令里先调整目录权限,每次启动容器时自动修复:
修改docker-compose.yml的php服务:

php:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
    volumes:
      - ./src:/var/www/html
    command: sh -c "chown -R www-data:www-data /var/www/html && php-fpm"

这个方法每次启动容器都会执行权限调整,适合快速测试,但不如统一UID的方法优雅。

验证修复

重新构建并启动容器:

docker-compose down && docker-compose up -d --build

现在访问你的站点,应该就能正常创建缓存目录了。

另外,检查Grav的user/config/system.yaml里的缓存配置,确保缓存目录指向的是容器内可写的路径(默认就是cache/,没问题)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:47:44