#apache #docker #permissions #docker-compose #docker-volume
#apache #docker #разрешения #docker-compose #docker-volume
Вопрос:
Я разрабатываю тему WordPress и хочу использовать Docker в своих настройках разработчика. То, что я сделал, довольно просто:
- создайте
database
службу под управлением MySQL 5.7 - создайте
wordpress
сервис, куда я монтирую свою папку темы в виде тома в/var/www/html/wp-content/themes
Однако я борюсь с разрешениями тома.
Я работаю со следующей структурой папок проекта:
.
├── docker-compose.yml
└── my-theme
Мой docker-compose.yml
файл выглядит следующим образом:
version: '3.2'
services:
database:
image: mysql:5.7
volumes:
- my_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: root
wordpress:
depends_on:
- database
image: wordpress:php7.3-apache
ports:
- '8000:80'
restart: always
environment:
WORDPRESS_DB_HOST: database:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: root
working_dir: /var/www/html
volumes:
- type: volume
source: ./my-theme
target: /var/www/html/wp-content/themes/my-theme
volumes:
my_data: {}
Когда я запускаю docker-compose up
, все работает как ожидалось: контейнеры создаются, и я могу получить доступ к WordPress в браузере. Однако тема, которую я смонтировал как том, ничего не отображает при ее активации.
Когда я sh
захожу в wordpress
контейнер ( docker-compose exec wordpress sh
), я вижу, что wp-content/themes
папка принадлежит root
. Итак, я решил, что это проблема.
Я проверил, что это проблема с разрешениями, вручную и рекурсивно chown
изменив wp-content
папку в контейнере:
chown -R www-data:www-data /var/www/html/wp-content
Как только это было сделано, моя тема отобразилась как ожидалось. Так что теперь я ищу способ избежать этого chown
процесса (идея в том, что любой другой разработчик может клонировать этот проект, просто запустить docker-compose up
и начать работать).
Первое, что я попробовал, это создать Dockerfile, где я бы создал слегка настроенный образ WordPress:
FROM wordpress:php7.3-apache
RUN mkdir -p /var/www/html/wp-content/themes/test-theme
amp;amp; chown -R /var/www/html/wp-content
Я обосновал это тем, что, создав каталог и chown
отредактировав его заранее, том унаследует сопоставление user: group. Увы, такого нет; монтирование тома переопределяет это сопоставление и возвращает его обратно в root:root
.
После этого я попытался установить переменные среды APACHE_RUN_USER
и APACHE_RUN_GROUP
в моем docker-compose.yml
файле:
version: '3.2'
services:
database:
...
wordpress:
...
environment:
WORDPRESS_DB_HOST: database:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: root
APACHE_RUN_USER: '$(id -u)'
APACHE_RUN_GROUP: '$(id -g)'
working_dir: /var/www/html
volumes:
- type: volume
source: ./my-theme
target: /var/www/html/wp-content/themes/my-theme
volumes:
my_data: {}
Однако это вызвало кучу ошибок Apache при сборке.
Сейчас я в некоторой растерянности. Существует ли какая-либо лучшая практика для управления разрешениями смонтированных томов в Docker? Я много гуглил для этого, но решения, которые я нахожу, немного выходят за рамки моей головы.
Комментарии:
1. С какими именно ошибками Apache вы сталкиваетесь? Я подозреваю,
'$(id -u)'
что это неправильно, поскольку переменные оболочки не вычисляются между одинарными кавычками, хотя я не уверен, что это применимо здесь. Кроме этого, выполнениеchown
в вашем Dockerfile абсолютно законно ( здесь обсуждается проблема GitHub с этой проблемой.)2. Действительно, я также думал, что выполнение
chown
в Dockerfile помогло бы (на основе той же проблемы GH, на которую вы ссылались), но, похоже, что как только я монтирую том, разрешения переопределяются и устанавливаются обратно в root: root. Я тестировал, выполняяdocker-compose up
сvolumes
ключом и без него в службе WordPress. Когда я загружаю в контейнер без смонтированного тома,ls -l
отображаетсяwww-data:www-data
для папки wp-content. Как только я монтирую том,ls -l
показываетroot:root
…
Ответ №1:
Вы можете сделать это, перезаписав точку входа для изображения WordPress.
Создайте файл startup.sh в вашем проекте и make является исполняемым:
#!/bin/bash
chown -R www-data:www-data /var/www/html/wp-content
docker-entrypoint.sh apache2-foreground
Затем в вашем docker-compose.yml:
...
wordpress:
...
working_dir: /var/www/html
volumes:
- './my-theme:/var/www/html/wp-content/themes/my-theme'
- './startup.sh:/startup.sh'
entrypoint: /startup.sh
У меня это сработало, дайте мне знать, если у вас возникнут проблемы с его реализацией.
Комментарии:
1. Подождите, я говорил слишком рано. Сборка контейнера WordPress была просто отложена больше, чем обычно, но в конечном итоге прошла. Теперь это работает! Спасибо за всю вашу помощь.