【问题标题】:Laravel and Docker permission issue - can't save filesLaravel 和 Docker 权限问题 - 无法保存文件
【发布时间】:2021-08-21 19:56:12
【问题描述】:

我已经从这篇文章中看到了解决方案:"https://stackoverflow.com/questions/50552970/laravel-docker-the-stream-or-file-var-www-html-storage-logs-laravel-log-co

但是这个解决方案还不够

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

php:        
    build:
        context: ./laravel
        dockerfile: Dockerfile
    container_name: laravel
    volumes:
        - ./laravel:/var/www/html

这是Dockerfile

FROM php:fpm-alpine

RUN docker-php-ext-install pdo pdo_mysql

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

所以我要么在localhost URL 上获得权限被拒绝(如在另一篇文章中所见),要么我在我的 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 权限并且无法再次保存文件,反之亦然。

【问题讨论】:

  • Dockerfile 的基本映像是什么?
  • php-fpm,也编辑了帖子

标签: laravel docker ubuntu


【解决方案1】:

在您的 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

这样,php-fpm 将作为具有这些标识符的用户执行:

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

【讨论】:

  • 谢谢!那到底是什么问题呢?有些帖子说 Laravel 期望 www-data 对这个 laravel.log 文件具有可写权限,有些帖子没有提到它。使用您的解决方案,我什至没有将用户设置为www-data,那么如果它期望www-data,它怎么能工作?
  • Laravel 并不“需要”用户是www-data,它只需要运行 php-fpm 的用户具有读写权限。在你的项目的文件上。解决问题的最简单方法是将您的项目用户设置为www-data,因为它是 php-fpm 的默认用户。但是,这种方法有一些缺点,您遇到了其中之一。在开发环境中,像我们在这里所做的那样使用user 选项非常好。快速注意,如果你 ssh 进入容器,用户将是“我没有名字!”。没关系,你可以忽略它。这是因为没有您提供的 id 的实际用户。
  • 谢谢!所以你的意思是在容器中将项目用户设置为www-data 可能是用于不触及容器的生产,并且项目文件被复制到它而不是符号链接?
  • 是的,就是这样:)
  • 你已经帮了我很多次了,你是真正的专家,谢谢!
猜你喜欢
  • 2016-04-29
  • 2017-01-26
  • 2021-12-29
  • 2012-05-17
  • 2019-07-18
  • 2018-02-03
  • 2013-03-03
  • 2021-11-18
相关资源
最近更新 更多