我最近一直在学习使用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中设置(请参阅此处)。
我的主机上的文件与我的用户名和组一起保存为所有者/组。
但是,当我通过浏览器访问该应用程序时,启动时出现权限被拒绝的错误(当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编写,执行等文件,但是当我创建或编辑文件时,文件所有权和组更改回到我的host phil:phil
,我想这将再次破坏应用程序。
我试图创建一个php映像,并设置env(如上面的链接中所述)以进行配置--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吗?
从字面上看,任何建议将不胜感激。
几周前遇到了同样的问题。
实际发生的情况是您的主机和容器通过卷共享相同的文件,因此,它们也共享权限。
在生产中,一切都很好-您的服务器(www-data
用户)应该是文件的所有者,因此这里没有问题。开发中的事情变得很复杂-当您尝试从主机访问这些文件时。
我知道一些解决方法,最棘手的是似乎www-data
将容器中的uid设置为1000,因此它将与主机中的uid相匹配。
另一个简单的方法是在共享目录上打开777的完全许可权,因为它仅在开发版本中需要-(但是永远不要在生产环境中完成,但是正如我之前提到的,在生产环境中您没有任何问题,因此必须分开这两个过程,并且只能在开发模式下执行)
对我来说,最优雅的解决方案似乎是允许所有组成员访问文件(设置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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句