Рекомендуемый способ предоставления файлов конфигурации для Docker контейнеров - PullRequest
0 голосов
/ 14 апреля 2020

Я перевожу наше веб-приложение в docker -компонентное развертывание (Django, DRF, AngularJS).

Docker выглядит solid сейчас и все идет хорошо .

Я хочу:

  • подтвердить с вами, что я следую рекомендациям в отношении файлов конфигурации приложения
  • знать, являются ли "файлы томов" на самом деле bind mounts, которые не рекомендуются

Мне удалось использовать переменные окружения и docker -создать секреты, прочитанные из файла Django settings.py, и это работает. Недостатком является то, что переменные окружения ограничены простыми строками и могут создавать некоторые проблемы с выходом при отправке списков Python, словарей и так далее c. Мы также должны определить и поддерживать множество переменных среды, поскольку наше веб-приложение установлено во многих местах и ​​легко настраивается.

На стороне интерфейса (AngularJS) у нас есть два constants.js файла и nginx конф. Я использовал CMD ["/start.sh"] в Dockerfile и у меня есть некоторые команды sed. Но это выглядит действительно хаки sh, и это также означает, что мы должны определить и поддерживать довольно много переменных среды.

  1. Являются ли тома Docker хорошей идеей для использования для этих файлов конфигурации?

  2. Существует ли такая вещь, как "файл тома" (, упомянутый здесь ), или это действительно так? привязное крепление? И монтирование с привязкой менее рекомендуется, так как оно зависит от файловой системы и пути к файлу на хосте.

Тома документации кратко упоминает файлы: "путь к файлу или каталог смонтирован в контейнере ", но не go более подробно.

Наше веб-приложение теперь имеет простые файлы конфигурации:

  • settings.py
  • site\contants.js
  • admin\constants.js

и:

Я хочу избежать перемещения этих файлов в специальные каталоги, которые можно монтировать.

Можете ли вы показать мне пример docker -compose.yml с тома одного файла (без привязки) .

Спасибо

1 Ответ

1 голос
/ 14 апреля 2020

Если вы не можете использовать переменные окружения, вам следует использовать привязку. Если вы используете именованный том, вы не можете получить доступ к отдельным файлам и не можете напрямую редактировать файлы конфигурации.

Именованный том - это всегда целый каталог, и к нему нельзя получить прямой доступ с хоста. Не существует такого понятия, как «файл тома» (ваш связанный вопрос полностью посвящен монтированию bind, некоторые используют синтаксис именованных томов), и нет способа монтировать один файл из именованного тома.

Более новые Docker имеют несколько различных синтаксисов для монтирования привязки (в Compose, конфигурация службы short и long volumes: или создание именованного тома type: bind). Все они в основном эквивалентны, и многие ответы в вопросе, на который вы ссылаетесь, включают в себя создание именованного тома, имитирующего привязку.

Docker Compose поддерживает относительные пути, так что вокруг меньше беспокойства пути хоста для монтирования привязки являются непереносимыми в разных системах. Фрагмент базового c файла docker-compose.yml может включать в себя:

services:
  app:
    build: django
    volumes:
      - ./config/django-settings.py:/app/settings.py

В этом примере я бы предложил (1012) каталог (deploy-time), содержащий файлы конфигурации, но это произвольный выбор; если вы хотите привязать монтирование ./django/settings.py из дерева исходных текстов приложения к тому, что находится на изображении, чтобы иметь возможность редактировать его напрямую, это тоже правильный выбор. Вы можете проверить это дерево в управлении исходным кодом, и оно будет работать независимо от того, где оно было извлечено.

Если вы используете базовое изображение с полным набором инструментов GNU (Ubuntu, а не Alpine), тогда ваш контейнер Сценарий entrypoint также может использовать envsubst в качестве очень легкого инструмента для создания шаблонов (он заменяет ссылки $VARIABLE эквивалентной переменной среды), который поможет вам поддерживать вариант «много параметров», но не «тип dict» Варианты "case.

В общем, я бы рекомендовал bind mounts для двух случаев и, возможно, для третьего: для файлов конфигурации (где оператор должен их непосредственно редактировать), для файлов журнала (где оператор должен напрямую прочитайте их) и, возможно, для постоянного хранения данных (где существующее решение для резервного копирования будет работать без изменений; но не в MacOS, где оно работает очень медленно). Именованные тома могут хорошо соответствовать случаю постоянных данных и лучше соответствовать тому, что вы использовали бы в кластерной среде (Swarm, Kubernetes), но к ним нельзя получить прямой доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...