12факторный подход к конфигурации с Docker
Есть ли еще какие-либо нативные или общепринятые подходы к использованию переменных среды для управления поведением Docker, т.е.
Единственный не зависящий от языка метод, который я видел, - это загрязнение команды docker run переменными -e. Наиболее приемлемое решение, которое я видел, - это использование комбинации cat и sed для генерации параметров CLI с использованием файла.env: https://twitter.com/DataKyle/status/422843345120296960
В настоящее время мы используем Vagrant для dev, поставщика CI/CD для тестирования и развертывания, а также AWS Elastic Beanstalk в качестве PAAS для подготовки и производства. Наше приложение имеет более 100 настраиваемых параметров, большинство из которых настроены на значения по умолчанию, но для каждой среды все еще необходимо настроить около 10-20 из них. Просто кажется слишком хакерским запускать докер с таким огромным списком переменных командной строки.
Кроме того, он не позволяет вам получать переменные с хоста докера (например, предварительно установленные учетные данные Redis или Postgres провайдера CI) без дальнейшего взлома.
Есть ли решение для этого я не нашел? Или это недостающий кусок для Докера? Или это как-то философски против философии Докера?
1 ответ
Docker 0.10.0 и новее (8 апреля 2014 г.) принимает docker run --env-file <filename>
, что позволяет кормить рабочую среду докера .env
файлы
Более того, вы можете позволить докерам взаимодействовать дальше: --volumes-from
может смонтировать все тома из указанного контейнера, и --link
позволяет контейнеру знать детали открытых портов упомянутого контейнера.
Хотя ссылка на запуск Docker в настоящий момент немного слабая, вы можете найти все подробности в разделе выполнения ссылки CLI, а также ссылку на ссылку контейнера.
С чего начать с контейнера. Обычно я рекомендую запустить сценарий оболочки, который устанавливает переменные среды по умолчанию (в соответствии с : ${ENV:=default_value}
), экспортирует их, затем exec
один исполняемый файл. Этот исполняемый файл может быть желаемым приложением на переднем плане или заменой инициализации, например runit
или же supervisord
,
Я бы не рекомендовал бегать sshd
внутри вашего докера, если он не является частью системы (например, контейнер для gitlab должен содержать sshd, поскольку он обеспечивает доступ к git repo через ssh). В целях обслуживания или отладки я рекомендую использовать nsenter
вместо.