Laravel в Docker контейнере - настройка пользователей и прав на директории и файлы для PHP и NGINX контейнеров
Никак не могу найти инструкцию как все таки правильно настраивать пользователя под которым должен запускаться 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
Как все сделать правильно, что бы не было этих проблем с чтением, записью и исполнением файлов, поделитесь своими вариантами пожалуйста!
Ответы (2 шт):
Оптимально, чтобы в итоге номера пользоваелей в разных контейнерах в итоге совпадали, тогда будет как будто он один.
Если образ собирается на той же машине, можно пробросить аргумент:
RUN useradd --uid $C4UID ...
и
docker build --build-arg C4UID=$(id -u) ...
Можно задавать USER ...
для запуска.
Можно просто посмотреть в докерфайлы и сделать из 2-х один попробовать.
Если хост винда -- C4UUID=1000
, но могут быть глюки всё равно.
Проблема решилась так: для сервисов PHP и NGINX в docker-compos.yml добавил маппинг UID с хоста в конетйнер user: '1000:1000'
services:
# Web service
nginx:
container_name: pod_nginx
build:
context: docker/images/nginx
user: '1000:1000'
...
# PHP service
php:
container_name: podvoh_tv_php
build:
context: docker/images/php
user: '1000:1000'
Убрал из Dockerfile обеих сервисов
RUN usermod ...
и для сервиса NGINX заменил базовый образ на
FROM nginxinc/nginx-unprivileged
перезагрузил контейнеры, запустил создание директории тем же методом фреймворка, ничего не поменялось, права остались те же (только для владельца), но при этом через браузер файлы стали отдаваться 200!
вывод: проблемы были с тем что NGINX работал не под тем же пользователем что и PHP и не мог прочесть файлы