Laravel 和 Docker 权限问题 - 无法保存文件

pil*_*eup 3 ubuntu laravel docker

我已经从这篇文章中看到了解决方案:“/sf/ask/3538707931/

但这个解决方案还不够

问题是,如果我执行解决方案中所述的操作,即chown -R www-data:www-data *在 Docker 容器内运行 - 它还会更改 Ubuntu 主机中实际文件夹的权限,而不仅仅是容器,因为我在文件中设置了此文件夹docker-compose.yml

php:        
    build:
        context: ./laravel
        dockerfile: Dockerfile
    container_name: laravel
    volumes:
        - ./laravel:/var/www/html
Run Code Online (Sandbox Code Playgroud)

这是Dockerfile

FROM php:fpm-alpine

RUN docker-php-ext-install pdo pdo_mysql
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu主机中的用户是myuser这样,当我运行时chown -R www-data:www-data *myuser不再具有主机上的权限,并且我无法保存文件。

因此,我要么在localhostURL 上获得权限被拒绝(如另一篇文章中所示),要么在我的 Ubuntu 主机上的 VS Code 上保存文件的权限被拒绝!(我正在使用 WSL2,这就是为什么我可以使用 VS Code)

把它们加起来:

  1. 为了能够将文件保存在已安装的卷上,我必须将其保存为 Ubuntu 用户,即 myuser我必须运行sudo chown -R myuser ~/myproject
  2. 但由于 Laravel 中的某些文件需要 的可写权限www-data,因此我无法访问我的网站localhost- 如上面的帖子所示。
  3. 如果我使用 更改 Docker 容器中的权限chown -R www-data:www-data /var/www/,我将失去myuser主机中的权限并且无法再次保存文件,反之亦然。

toy*_*oyi 7

在您的docker-compose.yml文件中,添加user: <uid>:<gid>

php:        
    build:
        context: ./laravel
        dockerfile: Dockerfile
    container_name: laravel
    user: "1000:1000" #type the "id" command in your terminal and look for uid and gid if you don't know what they are
    volumes:
        - ./laravel:/var/www/html
Run Code Online (Sandbox Code Playgroud)

这样,php-fpm 将以具有以下标识符的用户身份执行:

  • 当您从主机保存文件时(使用myuser),它将具有与 php-fpm 相同的标识符
  • 当php写入一个文件时,它也会被写入相同的标识符

  • Laravel 并不“需要”用户是“www-data”,它只需要运行 php-fpm 的用户具有读写权限。在您的项目文件上。解决问题的最简单方法是将项目用户设置为“www-data”,因为它是 php-fpm 的默认用户。但是,这种方法有一些缺点,您就遇到了其中之一。在开发环境中,像我们在这里所做的那样使用“user”选项是完全可以的。请注意,如果您 ssh 进入容器,用户将是“我没有名字!”。没关系,你可以忽略它。这是因为没有具有您提供的 ID 的实际用户。 (2认同)