Phi*_*oss 6 php docker docker-compose
我最近一直在学习使用 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
Run Code Online (Sandbox Code Playgroud)
上面的代码可能有也可能没有错误,因为我只是输入了它而不是复制和粘贴 - 但它在我的机器上工作。
问题是:
php-fpm 配置了--with-fpm-user=www-dataand --with-fpm-group=www-data,并在php:7.3-fpmDockerfile (see here) 中设置。
我主机上的文件以我的用户名和组作为所有者/组保存。
但是,当我通过浏览器访问应用程序时,我在启动时收到权限被拒绝错误(当 Laravel 尝试在存储中创建错误日志文件时)。我认为这是因为php-fpm作为 www-data 运行,但存储目录具有drwxr-xr-x所有者/组 phil:phil - 我的主机所有者和组的权限。
经过数小时的谷歌搜索和试验,我尝试了以下方法:
递归地将宿主机上代码目录的所有者和组更改为www-data:www-data. 这允许 Laravel 应用程序工作,但我现在无法使用 PHPStorm 在主机上创建或编辑 etc 文件,因为该目录是只读的(我猜是因为 phpstorm 以我的用户身份运行,并且目录由不同的用户拥有 /团体)。
我已将我的主机用户帐户添加到www-data组中,并使用 授予组write权限sudo chmod -R g+w ./code,现在允许应用程序运行应用程序,并允许 phpstorm 编写、执行等文件,但是当我创建或编辑文件时,文件所有权和组更改回我的主机phil:phil,我想这会再次破坏应用程序。
我尝试创建一个 php 图像,并将 env(如上面的链接中所述)设置为 configure with --with-fpm-user=phil --with-fpm-group=phil,但是在构建之后,它没有改变任何东西 - 它仍然使用 www-data 运行(在阅读了 github 问题之后)我认为这是因为 envs 直到以后才能更改,此时 php 已经配置了吗?)(请参阅此处的 github 问题)
我已经没有什么可以尝试的想法了。我唯一能想到的另一件事是递归地将我主机上代码目录的所有者和组设置为www-data并尝试运行 phpstorm www-data,但这感觉很奇怪(更新:我尝试以 www-data 用户身份打开 phpstorm,使用sudo -u www-data phpstorm.sh,但我得到一个 java 异常 - 与图形有关 - 所以这种方法也不可行)
现在,我能想到的尝试的唯一的事情是创建完全高山基地形象和旁路PHP的图像的新PHP图片-只是因为维护者希望使用这似乎是一个可怕的很多不便ENV,而不是ARG?
我不确定这种情况的最佳实践。我应该尝试更改 php-fpm 的运行方式(用户/组)吗?我应该更新主机上的目录所有者/组吗?我应该以不同的用户身份运行 phpstorm 吗?
从字面上看,任何建议将不胜感激。
Efr*_*tan 11
几周前遇到了同样的问题。
实际发生的情况是,您的主机和容器通过卷共享相同的文件,因此,它们也共享权限。
在生产中,一切都很好 - 您的服务器(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
Run Code Online (Sandbox Code Playgroud)
@bnoeafk 我只是将其作为新答案发布,尽管它基本上已经说过了。我不认为这很 hacky,它的工作原理基本上类似于 ntfsusermap,当然比更改所有文件权限更优雅。
对于 Dockerfile:
FROM php:7.4-apache
# do stuff...
ARG UNAME=www-data
ARG UGROUP=www-data
ARG UID=1000
ARG GID=1001
RUN usermod --uid $UID $UNAME
RUN groupmod --gid $GID $UGROUP
Run Code Online (Sandbox Code Playgroud)
每个使用此图像的用户都可以在构建时将自己传递到其中:docker-compose build --build-arg UID=$(id -u) --build-arg GID=$(id -g)
| 归档时间: |
|
| 查看次数: |
9988 次 |
| 最近记录: |