Laravel в Docker контейнере - настройка пользователей и прав на директории и файлы для PHP и NGINX контейнеров

laravel chmod

Никак не могу найти инструкцию как все таки правильно настраивать пользователя под которым должен запускаться 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 шт):

Автор решения: Sergei Kirjanov

Оптимально, чтобы в итоге номера пользоваелей в разных контейнерах в итоге совпадали, тогда будет как будто он один.

Если образ собирается на той же машине, можно пробросить аргумент: RUN useradd --uid $C4UID ... и docker build --build-arg C4UID=$(id -u) ...

Можно задавать USER ... для запуска.

Можно просто посмотреть в докерфайлы и сделать из 2-х один попробовать.

Если хост винда -- C4UUID=1000, но могут быть глюки всё равно.

→ Ссылка
Автор решения: toorr2p

Проблема решилась так: для сервисов 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 и не мог прочесть файлы

→ Ссылка