Docker php-fpm作为www-data运行

问题描述 投票:2回答:1

我最近一直在学习使用Docker构建图像和容器。在使用Mac时,我对它相当自信,但最近改用Ubuntu,我对这方面的开发相当新。

我使用标准的新Laravel项目作为我的“代码”,目前我只使用php容器和nginx容器。

我正在使用docker-compose.yml文件来创建我的容器:

version: "3.1"

services:
    nginx:
        image: nginx:latest
        volumes:
            - ./code:/var/www
            - ./nginx_conf.conf:/etc/nginx/conf.d/default.conf
        ports:
            - "80:80"
    php:
        image: php:7.3-fpm
        ports:
            - 9000
        volumes:
            - ./code:/var/www

上面的代码中可能有或可能没有错误,因为我只是输入它而不是复制和粘贴 - 但它可以在我的机器上运行。

问题是:

  • php-fpm配置了--with-fpm-user=www-data--with-fpm-group=www-data,这是在php:7.3-fpm Dockerfile (see here)中设置的。
  • 我的主机上的文件以我的用户名和组作为所有者/组保存。
  • 当我进入容器时,文件由1000和组1000拥有(我假设映射到我的用户帐户和主机上的组?)

但是,当我通过浏览器访问应用程序时,我在启动时收到权限被拒绝错误(当Laravel尝试在存储中创建错误日志文件时)。我认为这是因为php-fpm作为www-data运行,但存储目录拥有所有者/组phil的权限drwxr-xr-x:phil - 我的主机所有者和组。

经过数小时的谷歌搜索和试用后,我尝试了以下方法:

  • 递归地将主机上的代码目录的所有者和组更改为www-data:www-data。这允许Laravel应用程序工作,但我现在无法使用PHPStorm在主机上创建或编辑等文件,因为该目录是只读的(我猜因为phpstorm作为我的用户运行,并且目录由不同的用户拥有/组)。
  • 我已经将我的主机用户帐户添加到www-data组,并使用write授予组的sudo chmod -R g+w ./code权限,现在允许应用程序运行应用程序,并且phpstorm可以编写,执行等文件,但是当我创建或编辑文件,文件所有权和组更改回我的主机phil:phil,我想这将再次破坏应用程序。
  • 我试图创建一个php图像,并设置env(如上面链接中所述)配置--with-fpm-user=phil --with-fpm-group=phil,但是在构建之后,它不会改变任何东西 - 它仍然使用www-data运行(在读取github之后)问题我认为这是因为envs无法改变,直到后来,php已经配置好了?)(see github issue here)

我的想法已经用完了。我能想到的另一件事是,递归地将我的主机上的代码目录的所有者和组设置为www-data并尝试运行phpstorm作为www-data,但这感觉很奇怪(更新:我试图打开phpstorm作为www-data用户,使用sudo -u www-data phpstorm.sh,但我得到一个java异常 - 与图形有关 - 所以这种方法也是不可行的)

现在我唯一想到的就是尝试从高山基本图像创建一个新的PHP图像并完全绕过php的图像 - 这似乎是一个非常大的不便只是因为维护者想要使用ENV而不是ARG

我不确定这种情况的最佳实践。我应该尝试改变php-fpm的运行方式(用户/组)吗?我应该更新主机上的目录所有者/组吗?我应该以不同的用户身份运行phpstorm吗?

从字面上看,任何建议将不胜感激。

php docker docker-compose
1个回答
2
投票

几个星期前遇到了同样的问题。

实际发生的是您的主机和容器通过卷共享相同的文件,因此,它们也共享权限。

在生产中,一切都很好 - 您的服务器(www-data用户)应该是文件的所有者,所以这里没问题。当你试图从主机访问这些文件时,事情变得复杂。

我知道一些解决方法,最hacky似乎是将容器中的www-data uid设置为1000,因此它将匹配您在主机中的uid。

另一个简单的方法是在共享目录上打开777完全权限,因为它只在开发构建中需要 - (不应该在生产中完成,但正如我之前提到的,在生产中你没有任何问题,所以你必须分开2个进程,仅在开发模式下执行)

对我来说,最优雅的解决方案似乎是允许所有组成员访问文件(设置770权限),并将www-data添加到您的组:

usermod www-data -a -G phill #// add it to your group

chown -r phill ./code #// make yourself the owner. might need sudo.

chmod 770 ./code #//grunt permissions to all group members
© www.soinside.com 2019 - 2024. All rights reserved.