Разрешение отклонено при выполнении демонстрационного приложения Symfony через Docker

В моей первой попытке запустить более сложное приложение через Docker я выбрал приложение Демонстрация Symfony и собрал структуру сборки Docker для его размещения.

  • Первый образ — httpd: он запускается от имени пользователя root (после чего переходит на www-data) и общается через настраиваемую сеть «сервер».
  • Второй образ — php (fpm): он запускается от имени пользователя root (после чего переходит к www-данным), а также общается через пользовательскую сеть «сервер».
  • Третье изображение — composer: оно запускается как UID и GID 1000. Его команда точки входа — composer create-project symfony/symfony-demo symfony-demo
  • Все контейнеры используют одно и то же монтирование привязки, где находится приложение symfony-demo.

Затем я перехожу на localhost:8080 в браузере, чтобы получить ошибку Symfony:

The stream or file "/usr/local/apache2/htdocs/symfony-demo/var/log/dev.log" could not be opened: failed to open stream: Permission denied

Дело в том, что упомянутого файла даже не существует в /var/log/. Эта папка пуста.

Все файлы в монтировании привязки имеют разрешения 1000:1000 (мой пользовательский UID/GID) и настроены следующим образом: -rw-r--r--.

Я пробовал запускать httpd и php как: UID 33 (www-data) и GID 33; UID 0 (корень) и GID 33 (и наоборот); а также как 1000:1000 или 1000:33, но все эти комбинации (при успешном запуске httpd/php) приводят к одной и той же ошибке.

докер-compose.yml:

version: "3"
services:
  httpd:
    build: "./httpd/"
    container_name: "webserver"
    depends_on:
      - php
    ports:
      - "8080:80"
    networks:
      - server
    volumes:
      - ../app:/usr/local/apache2/htdocs/
  php:
    build: "./php/"
    depends_on:
      - composer
    container_name: "php"
    networks:
      - server
    volumes:
      - ../app:/usr/local/apache2/htdocs/
  composer:
    build: "./composer/"
    container_name: "composer"
    user: "1000:1000"
    volumes:
      - ../app:/usr/local/apache2/htdocs/
networks:
  server:
    driver: bridge

композитор Dockerfile:

FROM composer:1.8

WORKDIR /usr/local/apache2/htdocs/

CMD ["composer", "create-project", "symfony/symfony-demo", "symfony-demo"]

httpd файл докеры:

FROM httpd:2.4

COPY ./config/httpd.conf /usr/local/apache2/conf/httpd.conf
COPY ./config/httpd-vhosts.conf /usr/local/apache2/conf/extra/httpd-vhosts.conf
COPY ./config/php-fpm.conf /usr/local/apache2/conf/extra/php-fpm.conf

WORKDIR /usr/local/apache2/htdocs

php Докерфайл:

FROM php:7.3-fpm

RUN cp "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
COPY ./config/timezone.ini $PHP_INI_DIR/conf.d/
COPY ./config/www.conf /usr/local/etc/php-fpm.d/www.conf

RUN apt-get update && \
  apt-get install -y libicu-dev
RUN docker-php-ext-install intl

WORKDIR /usr/local/apache2/htdocs
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
2
0
1 898
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

просто дайте разрешение на запись

chmod -R 777 /usr/local/apache2/htdocs/symfony-demo/var/log/dev.log

здесь symfony doc для разрешения файла: https://symfony.com/doc/current/setup/file_permissions.html

Если я запускаю Symfony Demo вне Docker, мне не нужно исправлять какие-либо разрешения. Это просто работает. Почему это не так, когда я запускаю его в Docker? Вот что я хочу понять и решить правильно, заставив файл уже создаваться с правильными разрешениями.

crimson_king 05.07.2019 22:04
Ответ принят как подходящий

На второй мысли: мое предыдущее решение (как есть) не работает в RHEL/Fedora/CentOS, поскольку www-data там по умолчанию не существует, из-за чего Docker не запускается.


Мое новое решение - независимо от дистрибутива

Для простоты я решил просто написать сценарий точки входа композитора, чтобы установить разрешения -rw-rw---- в /app. Таким образом, я могу запустить композитор как пользователь 1000, и та же группа, с которой работает PHP (только для этого были созданы новый пользователь и группа). Теперь PHP может записывать в файлы базы данных SQLite3 внутри проекта, а композитор пишет как пользователь 1000, который я могу редактировать.

В основном это то, что сказал @habibun, но мне нужно дать только групповые права на запись, а не полные права на запись.

Имейте в виду, что SELinux откажет композитору в доступе на запись к вашему монтированию привязки. Вы должны настроить SELinux, чтобы разрешить эту операцию.

This is my repository where this project is stored, if you're looking for a reference: https://github.com/o-alquimista/symfony-demo-docker/


Решение для пространства имен пользователей — отлично работает для хостов Debian/Ubuntu

Composer должен писать в /app как пользователь 33 (www-data), так же как и php и httpd после того, как они сбросят привилегии. Я смог сохранить текущие настройки разрешений (только владелец может писать), используя пространства имен пользователей. Пользовательские www-данные теперь сопоставляются с диапазоном 967 и выше, что приведет к тому, что пользователь 33 будет = я (пользователь 1000).

Теперь все контейнеры могут писать куда им надо, а я могу редактировать файлы проекта как непривилегированный пользователь.

Другие вопросы по теме