最近我一直在学习使用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 中 (在此处查看)。我的主机上的文件以我的用户名和组作为所有者/组保存。
- 当我进入容器时,文件的所有者和组为 1000 和 1000(我假设是映射到我的用户帐户和主机机器上的组?)
然而,当我通过浏览器访问应用程序时,在启动时会出现权限被拒绝的错误(当 Laravel 尝试在存储中创建错误日志文件时)。我认为这是因为 php-fpm
作为 www-data 运行,但存储目录对于所有者/组 phil:phil 具有权限 drwxr-xr-x
- 即我的主机所有者和组。
经过数小时的谷歌和尝试后,我尝试了以下方法:
递归更改主机上的代码目录的所有者和组为
www-data:www-data
。这允许 Laravel 应用程序工作,但我现在无法使用 PHPStorm 创建或编辑等文件,因为该目录是只读的(我猜测因为 phpstorm 以我的用户身份运行,并且目录由不同的用户/组拥有)。我将我的主机用户帐户添加到
www-data
组中,并使用sudo chmod -R g+w ./code
授予组写权限,现在可以运行应用程序,并让 phpstorm 编写、执行等文件,但当我创建或编辑文件时,文件的所有权和组会再次变为我的主机 phil:phil,我想这可能会再次破坏应用程序。我尝试创建一个 PHP 映像,并设置 env(如上面的链接所述)以配置为
--with-fpm-user=phil --with-fpm-group=phil
,但构建后并没有改变任何东西 - 它仍然在使用 www-data 运行(从 GitHub 问题中读取,我认为这是因为 envs 无法更改,直到稍后,在此时点 PHP 已经配置好?)(在此处查看 GitHub 问题)
我正在尽力想要尝试的唯一其他事情是将我的主机代码目录的所有者和组递归设置为 www-data
,并尝试以 www-data
身份运行 phpstorm,但这感觉很奇怪(更新:我尝试以 www-data 用户身份打开 phpstorm,使用 sudo -u www-data phpstorm.sh
,但我收到一个与图形有关的 Java 异常 - 因此,此方法也不可行)
现在我能想到的唯一的事情就是从 alpine 基础镜像创建一个新的 PHP 映像,并完全绕过 PHP 的映像 - 这似乎非常麻烦,仅因为维护者想使用 ENV
1000:1000
,则用于访问文件的用户名无关紧要,只要它具有相同的 UID 即可。 - Coded Monkey