Приложения с дванадесет фактора за внедряване на микросервизи на Docker

Наистина харесвам идеите зад Манифеста на дванадесетте фактора. Опитвам се да ги приложа към малко внедряване в стил микросервиз за проект на Python/Django. Проектът Django е пакетиран в Docker контейнер, който се внедрява чрез Docker Hub.

Единственото нещо, което се опитвам да разбера, е как да се справя с конфигурационните файлове и променливите на средата. Общата мъдрост на приложенията с 12 фактора е, че конфигурацията трябва да се съхранява като променливи на средата, а не в контрола на източника. Мисля да внедря това с помощта на django-environ, който проверява променливите на средата, а също и файл .env за използване в dev.

Тогава как да задам тези променливи на средата в производството?

  • В Docker е възможно да декларирате променливи на средата като ENV в Dockerfile (doc). Така че мога да добавя тази информация там, но проверявам в Dockerfile с изходния код, така че това би провалило целта.
  • Бих могъл да създам допълнителен .env файл за производство и не да го проверявам в контрола на източника. Мога да копирам този производствен .env файл, докато изграждам изображението с помощта на командата COPY. Но това означава, че разработчикът ще има достъп до идентификационните данни на DB.
  • Настройте персонализиран тригер за изграждане, така че когато кодът се актуализира в контролата на източника, да се издава тригер за изграждане. Когато изображението се изгражда, този изграждащ възел добавя този .env файл и се разполага на сървъра.

Чувствам, че третият вариант е единственият, който има смисъл. Но дори и в този случай, конфигурационните елементи все още се съхраняват във файл, а не наистина в променливи на средата.

Някакви идеи как да се справим с това?


person user1496984    schedule 27.10.2015    source източник
comment
Когато използвате докер контейнери като цяло, работният поток предава променливите на средата в командата докер, като docker run -e FOO=bar image. Като алтернатива можете да ги прочетете от файл, предаващ --env-file file. Освен това вярвам, че задействането на персонализирано изграждане също би нарушило мъдростта, тъй като бихте кодирали твърдо променливите за cnofiguration в докер изображение. Това важи и за командата COPY. Друга възможност е монтирането на конфигурационен файл, но това трябва да се направи само ако използването на променливи на средата е невъзможно.   -  person Lukas Juhrich    schedule 27.10.2015
comment
Вижте също stackoverflow.com/questions/25177402 /   -  person ebullient    schedule 29.10.2015
comment
@Luke Вие споменавате като последна възможност, че монтирането на конфигурационен файл трябва да бъде последната опция. След като прочетох още малко за това, останах с впечатлението, че това трябва да е най-добрият вариант, нали? Имате .env файл на хоста и го монтирате към Docker, представете си така, че Django да го вземе?   -  person user1496984    schedule 03.11.2015
comment
@user1496984 не бъркайте използването на .env файлове с конфигурационните файлове за монтиране! .env файловете (използвани чрез --env-file) са само един вид „стенописно обозначение“ за предаване на променливи на средата, докато монтирането на конфигурационен файл е активно добавяне на нещо към контейнера за докери (т.е. неговата файлова система). Използването на променливи на средата е по-добрият (по-чист) вариант, тъй като оставяте самия контейнер недокоснат, а освен това те са там за това – да предоставят информация за средата, т.е. с какви параметри трябва да се използва приложението.   -  person Lukas Juhrich    schedule 04.11.2015