PankovAlxndr
@PankovAlxndr
Fullstack web developer

Как победить проблему с правами laravel / docker?

поднимаю laravel в докере на основе alpine образов, хост машина Linux Ubuntu
docker-compose у меня состоит из nginx, php-cli, php-fpm

cli DockerFile:
FROM php:8.2.1-cli-alpine3.17
ENV XDEBUG_VERSION 3.2.0
RUN apk add --no-cache bash coreutils git linux-headers \
    && git clone --branch $XDEBUG_VERSION --depth 1 https://github.com/xdebug/xdebug.git /usr/src/php/ext/xdebug \
    && docker-php-ext-configure xdebug --enable-xdebug-dev \
    && docker-php-ext-install xdebug \
    && apk del git
RUN apk add --no-cache unzip
RUN mv $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini
COPY ./common/php/conf.d/security.ini /usr/local/etc/php/conf.d/security.ini
COPY ./common/php/conf.d/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
COPY ./common/wait-for-it.sh /usr/local/bin/wait-for-it
RUN chmod 555 /usr/local/bin/wait-for-it
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/bin --filename=composer --quiet
RUN addgroup -g 1000 app && adduser -u 1000 -G app -s /bin/sh -D app
WORKDIR /app
USER app

Те я ставлю все что мне нужно из ПО далее, так как я на хост машине сижу из под юзера с id 1000, то такого же создаю внутри контейнера и указываю что запуск идет через него USER app (последние 3 строки конфига). Все вроде устраивает, захожу в контейнер там через композер все ставлю или руками создаю, владелец и группа у меня 1000, как и на хост машине в IDE и с правами нет проблем.

fpm DockerFile:
FROM php:8.2.1-fpm-alpine3.17
ENV XDEBUG_VERSION 3.2.0
RUN apk add --no-cache fcgi git linux-headers \
    && git clone --branch $XDEBUG_VERSION --depth 1 https://github.com/xdebug/xdebug.git /usr/src/php/ext/xdebug \
    && docker-php-ext-configure xdebug --enable-xdebug-dev \
    && docker-php-ext-install xdebug \
    && apk del git
RUN mv $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini
COPY ./common/php/conf.d/security.ini /usr/local/etc/php/conf.d/security.ini
COPY ./common/php/conf.d/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
COPY ./common/php/conf.d/timeouts.ini /usr/local/etc/php/conf.d/timeouts.ini
COPY ./common/php/php-fpm.d/ping.conf /usr/local/etc/php-fpm.d/ping.conf
WORKDIR /app
COPY ./php-fpm/development/entrypoint.sh /usr/local/bin/docker-php-entrypoint
RUN chmod +x /usr/local/bin/docker-php-entrypoint
HEALTHCHECK --interval=5s --timeout=3s --start-period=1s \
    CMD REDIRECT_STATUS=true SCRIPT_NAME=/ping SCRIPT_FILENAME=/ping REQUEST_METHOD=GET \
    cgi-fcgi -bind -connect 127.0.0.1:9000 || exit 1

Тут же я не создаю никакого пользователя 1000, тк оно мне мешает, а именно внутри /usr/local/bin/docker-php-entrypoint у меня идет запись в /etc/hosts и если там не root, то возникают проблемы.

еще есть nginx но там все просто и запуск идет от рута

все поднимается, стучусь в приложение localhost:8080 и вижу ошибку
The stream or file "/app/storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission denied

Да, она логичная:
у меня внутри контейнера с fpm в файле /usr/local/etc/php-fpm.d/www.conf такая запись
user = www-data
group = www-data

те php-fpm работает из под юзера www-data
а id юзера www-data в apline образах 82 и они ни в каких группах не состоит
----------------
вот и получается, что laravel у меня ставится из под cli контейнера
с user_id - 1000 (как на хосте) и права на все папки именно 1000:1000,
а когда стучусь через браузер и nginx (который так же из под рута) вызывает php-fpm, который пытается записать какой-то лог/кеш/сессию в папку, то у меня php (82:82) не может создать файл в папке с правами (1000:1000), у них нет пересечений никаких....

Понимаю, что можно фигануть 777 на папку с кешем и все, но так делать не хочу.
Посоветуйте какой самый верный путь решения проблемы?
  • Вопрос задан
  • 651 просмотр
Решения вопроса 1
добавить в группу appпользователя www-data

в fpmDockerfile:

USER root
RUN addgroup -g 1000 app && addgroup www-data app
RUN adduser -u 1000 -s /bin/sh -D -G app app
USER www-data
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы