Отказано в доступе при запуске демонстрационного приложения Symfony через Docker - PullRequest
1 голос
/ 05 июля 2019

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

  • Первое изображениеэто httpd: он запускается от имени пользователя root (затем возвращается к www-данным) и общается через пользовательскую сеть 'server'.
  • Второе изображение - php (fpm): он запускается от имени пользователя root (сбрасывается на www-data)впоследствии), а также общается через пользовательскую сеть «сервер».
  • Третье изображение - композитор: оно работает как 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 (root) и GID 33 (и наоборот);а также как 1000: 1000 или 1000: 33, но все эти комбинации (при успешном запуске httpd / php) приводят к одной и той же ошибке.

docker-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 Dockerfile:

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 Dockerfile:

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

Ответы [ 2 ]

1 голос
/ 05 июля 2019

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

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

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

0 голосов
/ 09 июля 2019

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


Мое новое решение - дистрибутивный агностик

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

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

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

Это мой репозиторий, в котором хранится этот проект, если вы ищете ссылку: https://github.com/o-alquimista/symfony-demo-docker/


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

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

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

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