Статьи

Задание переменных среды для Docker с рис.

Последние несколько месяцев я играл с  Docker , и до сих пор мне было весело.  Документация  отлично, и в одной простой  команде  вы можете начать экспериментировать. После прохождения учебника одной из моих первых целей было выяснить, как лучше всего создать образ Docker для   службы весенней загрузки . Мои первоначальные цели должны были сделать его легко установить переменные окружения, так как наши проекты следуют  двенадцать-фактор методология. Одним из нескольких факторов, которым мы следуем, является третий фактор (III. Config), который рекомендует хранить конфигурацию в среде. Хотя это имеет много преимуществ, одним из недостатков является тенденция к созданию большого количества переменных среды, поскольку это быстро, легко и четко определено. Это затрудняет настройку, тестирование и запуск службы. Но, как мы увидим,  Fig  не только упростит настройку переменных среды, но и предоставит множество других преимуществ.

Изображение Docker
Давайте сначала начнем с притворного сервиса, называемого сервисом регистрации. Это Java-сервис, созданный с помощью Spring-Boot. Вот основной Dockerfile: 

FROM dockerfile/java:oracle-java8
COPY logging-service-0.1.0.jar /data/
EXPOSE 8080
CMD ["java", "-jar", "logging-service-0.1.0.jar"]

ОТ  — базовый образ, с которого я начинаю. В данном случае это   базовый образ dockerfile / java с тегом Oracle JDK 8.
COPY  — здесь я копирую jar, чтобы он присутствовал в образе
EXPOSE  — это говорит Docker, что контейнер будет прослушивать порт 8080 во время выполнения
CMD  — здесь я определил команду по умолчанию для запуска, которая запустит службу.

Далее нам нужно build image:
docker build --tag="jlorenzen/logging-service:v1" .

Docker Run
Теперь мы можем запустить наш новый сервис, выполнив эту команду:
docker run -dP jlorenzen/logging-service

Это здорово, но давайте представим, что для службы регистрации требуются следующие переменные среды: ENV_1 и ENV_2. Вот как вы должны запустить сервис, одновременно устанавливая переменные среды:
docker run -dP -e ENV_1=value1 -e ENV_2=value2 jlorenzen/logging-service

Это базовый пример, но вы можете представить, насколько неприятным он может быть, если вашему сервису требуется дюжина или более переменных среды. У  docker run команды также есть несколько других приятных опций для установки переменных окружения. Например, при использовании  -e опции, если вы предоставляете только имя, как  -e ENV_1 без значения, будет использоваться текущее значение этой переменной. Или вы можете использовать  --env-file опцию, чтобы указать файл, который содержит список переменных среды. Хотя все это работает, на самом деле не очень приятно помнить все эти опции и команды. Вот где фиг может помочь. И это не только помогает нам легко устанавливать переменные окружения, но и делает создание контейнеров более простым и воспроизводимым для любого человека в любом месте.

инжир
По сути, Fig — это простая утилита, которая оборачивает Docker, облегчая создание и управление контейнерами Docker. В нашем случае мы будем использовать его для запуска нашего образа службы регистрации и установки переменных среды. Вот простой  fig.yml файл:

logging-service:
  image: jlorenzen/logging-service
  ports: 
   - "8080"
  environment:
   - ENV_1
   - ENV_2

Как видите, я не указывал никаких значений для переменных среды. Это потому, что я уже определил их на своем хосте с помощью  direnv,  и Fig просто автоматически их использует. Так что в моем случае у меня есть локальный  .envrc файл, который содержит следующее:

export ENV_1=value1
export ENV_2=value2

Это позволяет мне устанавливать все переменные окружения в одном месте. Вот команда, которую я могу использовать для запуска контейнера:
fig up

Вот и все! Гораздо проще, чем соответствующая  docker run команда.

Идеальный мир
То, что было бы лучшим в обоих мирах, было бы, если бы Fig поддерживал эту  docker run --env-file опцию и мог читать в файле, содержащем  export команды, необходимые для direnv. Похоже, поддержка  --env-file опции на рис  скоро появится , так что мы на полпути