关于PHP执行用户和docker路径挂载的问题

本文最后更新于 2024年5月16日。

关于PHP执行用户的问题

对于通过SFTP上传文件搭建的网站,有时会遇到权限问题。要么权限没给够,提示没有权限。一般遇到这种直接给全部权限,也就是‘777’权限可以解决。但对于安全设置严格的web程序这么操作会提示文件夹或文件可以被其他用户读取不安全,这就需要改文件夹或文件的所属用户了。
然而并不知道,用户是谁。下面是我在解决该问题时学习的一些方法。不过到目前位置还是没有理解透彻。
我在搭建nextcloud的时候就遇到了上面提到的问题,参考官方镜像搭建成功的web程序,发现很多文件夹所属用户是‘33’,但是主机系统中并没有这个用户。

php配置文件中的用户组如下,如果不存在,会使用默认用户执行。

user = www-data
group = www-data
www-data

获取nginx和php用户和组

[root@iZ8vbajg9wo8iwynfb1lgeZ data]# ps axu|grep nginx
root     1322844  0.0  0.3  37772  6232 ?        Ss   15:12   0:00 nginx: master process nginx -g daemon off;
101      1322890  0.0  0.3  38364  6740 ?        S    15:12   0:00 nginx: worker process
root     1331548  0.0  0.0  12108  1052 pts/0    S+   15:36   0:00 grep --color=auto nginx
[root@iZ8vbajg9wo8iwynfb1lgeZ data]# ps axu|grep php
root     1322682  0.0  1.4 216796 26416 ?        Ss   15:12   0:00 php-fpm: master process (/usr/local/etc/php-fpm.conf)
admin    1323298  0.1  2.3 223656 44364 ?        S    15:13   0:01 php-fpm: pool www
admin    1323731  0.1  2.3 223592 43104 ?        S    15:14   0:01 php-fpm: pool www
admin    1324200  0.1  2.2 223484 42808 ?        S    15:15   0:01 php-fpm: pool www
root     1331742  0.0  0.0  12108  1076 pts/0    S+   15:36   0:00 grep --color=auto php

**

docker路径挂载问题

build成功之后的部分日志

117668470    0 drwxr-xr-x 2 root root      24 Sep 21 14:37 /tmp/pear/temp/pear-build-defaultuser6thOCT/install-mongodb-1.11.1/usr/local/lib/php/extensions/no-debug-non-zts-20210902
117668471 8396 -rwxr-xr-x 1 root root 8595192 Sep 21 14:37 /tmp/pear/temp/pear-build-defaultuser6thOCT/install-mongodb-1.11.1/usr/local/lib/php/extensions/no-debug-non-zts-20210902/mongodb.so
Build process completed successfully
Installing '/usr/local/lib/php/extensions/no-debug-non-zts-20210902/mongodb.so'
install ok: channel://pecl.php.net/mongodb-1.11.1
configuration option "php_ini" is not set to php.ini location
You should add "extension=mongodb.so" to php.ini
Removing intermediate container 237ce43c5051
---> b906dd260c8a
Step 14/14 : CMD ["php-fpm", "-F"]
---> Running in 4f4c3a4fbb19
Removing intermediate container 4f4c3a4fbb19
---> 29dc477d866c
Successfully built 29dc477d866c
Successfully tagged php:8.1

有时候LNMP的php和nginx不能自动生成配置文件,需要单独启动,进入容器获取
报错内容

nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)

使用相对路径或者绝对路径映射文件夹的时候存在这个问题,因为映射的主机文件夹时新建的空文件夹,覆盖了容器文件夹,因此容器内的目录会被清空。按照下面的方法单独启动容器并进入bash之后就好了。
使用挂载卷可以避免这个问题,即容器中的非空目录是其Dockerfile中使用VOLUME命令声明过的,则容器内文件会被复制到宿主机。

只要宿主机的目录不为空,则一定会覆盖掉容器内的目录。

docker container create --name tmp1 nginx:1.17.0
docker run -it --rm nginx:1.17.0 bash
docker container create --name tmp1 php:8.1
docker run -it --rm php:8.1 bash
docker container create --name tmp1 php:8.0
docker cp tmp1:/usr/local/etc/ /home/php-config #整个文件夹移了过来,需要移动到合适的位置和映射的文件夹一致
docker container rm tmp1
docker container create --name tmp1 nginx:1.17.0
docker cp tmp1:/etc/nginx /home/admin/dockerNextCloud/nginx_config
docker container rm tmp1
docker container create --name tmp1 mysql:8.0
docker cp tmp1:/etc/mysql /home/admin/dockerNextCloud
docker container rm tmp1