Я создаю образ Docker для своего Symfony
приложения, и мне нужно дать разрешение серверу apache записывать в папки кеша и журнала
#Dockerfile
FROM php:7-apache
RUN apt-get update \
&& apt-get install -y libicu-dev freetds-common freetds-bin unixodbc \
&& docker-php-ext-install intl mbstring \
&& a2enmod rewrite
COPY app/php.ini /usr/local/etc/php/
COPY app/apache2.conf /etc/apache2/apache2.conf
COPY ./ /var/www/html
RUN find /var/www/html/ -type d -exec chmod 755 {} \;
RUN find /var/www/html/ -type f -exec chmod 644 {} \;
RUN chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs
Когда я создаю этот образ с помощью docker build -t myname/symfony_apps:latest .
и запускаю контейнер с docker run -p 8080:80 myname/symfony_apps:latest
. Журнал Apache переполнен ошибками, в которых отказано в разрешении, странная вещь, с которой я проверил, ls -a
и разрешения в порядке. и когда я запускаю chmod из контейнера bash, проблемы с разрешением apache исчезают, и приложение работает хорошо
Ситуация
Выполнение команд chmod из dockerfile: разрешения изменены, но apache по-прежнему жалуется на отказ в доступе . Выполнение одних и тех же команд chmod с bash внутри контейнера: разрешения изменены, и мое приложение работает
Любая идея, я что-то упустил, может быть, я должен добавить пользователя root где-нибудь в Dockerfile?
источник
apache2.conf
) не вызывает проблемы? Уходят ли ошибки, если вы не устанавливаетеapache2.conf
?Ответы:
У меня была та же проблема, и кажется, что есть некоторая ошибка в Docker или Overlay2, если содержимое каталога создается в одном слое, а его разрешения изменяются в другом.
В качестве обходного пути вы можете скопировать исходные коды во временный каталог:
А затем переместите его
/var/www/html
и настройте права доступа (однойRUN
командой):Также я создал выпуск GitHub .
источник
Оболочкой по умолчанию для RUN в Docker является / bin / sh, и именно здесь разрешения, которые не были установлены правильно, действительно имеют проблему.
Но вы можете вместо этого просто использовать / bin / bash, чтобы легко исправить, заметить до и после листинга каталога
источник
/bin/bash -c 'chmod +x file'
работает, а нет/bin/sh -c 'chmod +x file'
?Попробуйте добавить:
Это сработало для меня.
источник
Эта проблема, вероятно, является результатом
VOLUME
определения внутри вышестоящего Dockerfile. Когда том определен в Dockerfile, вы можете добавлять файлы с помощью командыCOPY
илиADD
непосредственно в образ. Тем не менее,RUN
строка будет:RUN
команды, вы увидите, что ваши изменения применены, но эти изменения были применены к томуdocker diff
если вы не удалите временные контейнеры (вы можете запустить сборку,--rm=false
чтобы они остались)Из-за этого поведения у вас есть варианты:
Обратите внимание, что внутри текущих изображений php, кажется, что объем был удален, что означает, что у нас фактически есть вариант 3.
источник
Я только что провел эксперимент со следующим:
И это просто прекрасно работает.
Однако
Когда я перезаписываю этот исполняемый файл через тома docker-compose,
execute
разрешение просто откатывается - технически переопределяется на исходное разрешение файла.Исправление для режима dev - это просто
chmod a+x yourfile
от хоста, который будет наследоваться при монтировании тома.источник
docker run
команды и без монтирования внешнего тома.