Последние несколько месяцев я играл с 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
опции на рис скоро появится , так что мы на полпути