Как управлять разрешениями для тома, смонтированного в Docker-контейнере? - PullRequest
1 голос
/ 24 апреля 2019

Я занимаюсь разработкой темы Wordpress и хочу использовать Docker в моей настройке dev.То, что я сделал, довольно просто:

  • создайте database сервис под управлением MySQL 5.7
  • создайте wordpress сервис, где я монтирую папку своей темы как том в/var/www/html/wp-content/themes

Однако я борюсь с разрешениями для тома.

Я работаю со следующей структурой папок проекта:

.
├── docker-compose.yml
└── my-theme

MyФайл 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 \
  && chown -R /var/www/html/wp-content

. Я решил, что, создав каталог и chown заранее его, томбудет наследовать пользователя: сопоставление группы.Увы, нет такой вещи;монтирование тома переопределяет это сопоставление и устанавливает его на 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 Ответ

1 голос
/ 24 апреля 2019

Вы можете сделать это, переписав точку входа для изображения WordPress.

Создайте файл startup.sh в вашем проекте и сделайте исполняемый файл:

#!/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

Это сработало для меня, дайте мне знать, если у вас есть проблемы с его реализацией.

...