Как управлять разрешениями для тома, смонтированного в контейнер docker?

#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 была просто отложена больше, чем обычно, но в конечном итоге прошла. Теперь это работает! Спасибо за всю вашу помощь.