[Из песочницы] Альтернативная версия упаковки Java приложения в Docker27.09.2016 19:03
Прочитав статью об упаковке JVM приложения в Docker, я остался в смятении. Я, как и любой разработчик, хочу чтоб мои волосы развевались на ветру контейнер собирался за одну команду, сразу, без лишних телодвижений. Чтобы конфигурация проекта и сборки была собрана в одном файле, и чтобы не было зависимостей от внешних систем.
Далее последует альтернативный способ сборки Java-приложений в Docker контейнер используя Maven.
Для сборки нам понадобится Java проект, Maven и немного терпения, чтоб все это завести.
Дисклеймер
Я предполагаю, что читатель уже знаком Java, Maven и Docker. Представляет, что написано в Docker-файле, зачем все ему это надо и вообще ниндзя
В это раз, мы будем использовать Maven-плагин от fabric8io.
Предположим, что у нас микро-сервис, который упаковывается в jar-файл, содержащий main метод, который и надо запустить для старта приложения. Добавляем плагин в build секцию:
И, в общем то, все. Разберем поподробнее, что у нас там написано.
В начале идёт типичное определение плагина с версией. Далее идёт определение в какие фазы луны сборки мы хотим собирать и пушить наш контейнер. В моем случае сборка контейнера (build) будет происходить во время упаковки проекта (phase: package).
Пуш (push) контейнера в репозиторий будет происходить во время фазы деплой (deploy).
Maven имеет скотскую привычку запускать различные плагины одной фазы в не совсем контролируемом порядке, ака как бог на душу положит. Частенько, его невозможно убедить что запускать сборку контейнера надо после того как прошла сборка кода. Решения я так и не придумал, кроме как перенести все в фазу деплой. Не совсем красиво выходит, но так оно всегда работает.
Если это ваш случай, то секция исполнения схлопывается до следующей:
Build & Push docker containerdeploybuildpush
Также можно перенести сбоку на фазу install. Может кто знает, как заставить Maven исполнять плагины в нужном порядке?
Определяем имя образа и репозиторий:
${project.artifactId}registry.io
Если репозиторий не указан, то будет использоваться репозиторий Docker-а. Документация для дальнейшего чтения.
Описание сборки образа осуществляется в секции . По сути это отражение Docker файла в Maven.
from — базовый образ
tags — теги с которыми будет собран образ
ports — открытые порты
cmd — строка запуска, так же можно указать entryPoint, о все доступных опциях можно почитать в документации.
Это типичная строка запуска Java приложения, завернутая в shell форму Docker-а, в представлении Maven-а.
assembly — самая интересная часть плагина. Она определяет, что будет упаковано в образ контейнера и как. Есть несколько вариантов как можно описать упаковку, я выбрал inline, но есть и другие варианты.
В примере, я хочу взять все зависимости проекта и сложить в папку «jars»:
jars
А так же, артефакт проекта, собственно наше приложение, туда же, а конфигурационный файл в корень контейнера.