我只是找不到如何正确配置 PHP 和 NGINX 在容器中运行的用户的说明,以便主机系统上的用户有权访问目录和 xwr 文件,并且容器中或容器上都没有问题主持人(如果阅读、编辑、创建)。
我查看了向 Docker 添加项目的各种说明,但到处都忽略了这一点,因此 PHP 仅为所有者创建具有 xwr 权限的目录,导致 NGINX(或 Laravel)在访问文件时返回 404在这些目录中。
NGINX:docker/images/nginx/Dockerfile
FROM nginx:stable-alpine
WORKDIR /var/www/html/public
PHP:docker/images/php/Dockerfile
RUN usermod -u 1000 -a -G www-data www-data
USER www-data
WORKDIR /var/www/html
docker-compose.yml
services:
nginx:
build:
context: docker/images/nginx
volumes:
- './docker/images/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf:ro'
- './docker/logs/nginx:/var/log/nginx'
- './source:/var/www/html'
ports:
- 80:80
links:
- php
php:
build:
context: docker/images/php
user: '1000:33'
volumes:
- './source:/var/www/html'
- './docker/logs/php:/var/log/php/'
通过这些带有 nginx 和 php 的容器的配置,Laravel 创建一个具有以下权限和所有者的目录
drwx------ 3 www-data www-data 4096 дек 17 22:10 upload
在这种情况下,将使用以下权限创建此目录中的文件
-rw-r--r-- 1 www-data www-data 17782 дек 17 22:10 sddefault.jpg
我使用该方法创建一个目录和图像
\Illuminate\Support\Facades\Storage::put
如何正确地完成所有操作,以便在读取、写入和执行文件时不会出现问题,请分享您的选择!

最好是最终不同容器中的用户数最终一致,那么就好像只有一个用户一样。
如果镜像是在同一台机器上构建的,则可以转发参数:
RUN useradd --uid $C4UID ...和docker build --build-arg C4UID=$(id -u) ...可以设置
USER ...运行。您可以只查看 dockerfiles 并尝试二选一。
如果主机是Windows
C4UUID=1000,但仍可能出现故障。问题是这样解决的:对于 docker-compos.yml 中的 PHP 和 NGINX 服务,我添加了从主机到用户容器的 UID 映射:'1000:1000'
从 Dockerfile 中删除了这两个服务
对于 NGINX 服务,我将基础镜像替换为
我重新启动了容器,开始使用相同的框架方法创建目录,没有任何改变,权限保持不变(仅适用于所有者),但同时开始通过浏览器传输 200 个文件!
结论:NGINX 与 PHP 没有在同一用户下运行并且无法读取文件是否存在问题?