docker 报Permission denied 解决方法

这个错误表明 Laravel 无法将日志写入 /var/www/html/storage/logs/laravel.log,可能确实是由于 Docker 容器内的文件权限问题导致的。要解决这个问题,请遵循以下步骤:

  1. 更新 Dockerfile-php-fpm 文件以确保设置了适当的文件权限:
   FROM php:8.0-fpm

   RUN apt-get update && apt-get install -y \
     zlib1g-dev \
     libpng-dev \
     libjpeg-dev \
     libfreetype6-dev \
     zip \
     unzip

   # 添加下面这行命令
   RUN usermod -u 1000 www-data

   RUN docker-php-ext-configure gd \
     --with-freetype=/usr/include/ \
     --with-jpeg=/usr/include/

   RUN docker-php-ext-install pdo_mysql gd

   WORKDIR /var/www/html

在这里,我们使用 usermod 命令修改了 www-data 用户的 UID 为 1000(这通常是宿主机上第一个非 root 用户的 UID)。这样可以确保 www-data 用户具有访问宿主机上挂载目录的权限。

  1. 更新 docker-compose.yml 文件中的 PHP 服务部分,确保宿主机上的文件和目录与容器内的用户 ID 相匹配:
   php:
     build:
       context: .
       dockerfile: Dockerfile-php-fpm
     container_name: my_laravel
     working_dir: /var/www/html
     user: "1000:1000"    # 添加这一行,确保容器内以正确的用户和组运行
     volumes:
       - ./laravel:/var/www/html
     depends_on:
       - composer
  1. 在宿主机上,更改 Laravel 项目的 storagebootstrap/cache 目录的权限,以便容器内的用户可以访问和写入这些目录:
   sudo chown -R 1000:1000 ./laravel/storage
   sudo chown -R 1000:1000 ./laravel/bootstrap/cache
  1. 使用 docker-compose down 停止并删除现有容器,然后使用 docker-compose up --build 重建并启动新容器。

完成上述步骤后,您的 Laravel 项目应该可以正常写入日志文件,而不会出现权限问题。

发表评论