В моей первой попытке запустить более сложное приложение через Docker я выбрал приложение Демонстрация Symfony и собрал структуру сборки Docker для его размещения.
composer create-project symfony/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




просто дайте разрешение на запись
chmod -R 777 /usr/local/apache2/htdocs/symfony-demo/var/log/dev.log
здесь symfony doc для разрешения файла: https://symfony.com/doc/current/setup/file_permissions.html
На второй мысли: мое предыдущее решение (как есть) не работает в 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/
Composer должен писать в /app как пользователь 33 (www-data), так же как и php и httpd после того, как они сбросят привилегии. Я смог сохранить текущие настройки разрешений (только владелец может писать), используя пространства имен пользователей. Пользовательские www-данные теперь сопоставляются с диапазоном 967 и выше, что приведет к тому, что пользователь 33 будет = я (пользователь 1000).
Теперь все контейнеры могут писать куда им надо, а я могу редактировать файлы проекта как непривилегированный пользователь.
Если я запускаю Symfony Demo вне Docker, мне не нужно исправлять какие-либо разрешения. Это просто работает. Почему это не так, когда я запускаю его в Docker? Вот что я хочу понять и решить правильно, заставив файл уже создаваться с правильными разрешениями.