Рекомендации Dockerfile относительно артефактов Nexus и инструкции по сборке - PullRequest
0 голосов
/ 07 мая 2018

Я в некотором роде новичок в Docker и пытаюсь понять некоторые рекомендации передового опыта, касающиеся процесса сборки в Dockerfile.

Я знаю, что для традиционного приложения JAVA мы обычно будем использовать maven для извлечения зависимых библиотек из репозитория Nexus, исходного кода из GIT или другого CM, а затем для сборки приложения. Наконец, выходной файл .war снова будет сохранен в папке с тегами выпуска в репозитории Nexus для копирования в другие среды (dev / qa / production и т. Д.). Но осталась одна проблема - несоответствия между различными средами, и мы пытаемся использовать контейнеры для решения этой проблемы - имея в виду, что после тестирования в контейнере мы можем просто отправить этот контейнер по конвейеру в другую среду, и они должны работать без каких-либо проблема, поскольку контейнер включает в себя зависимости среды и все, что нужно веб-приложению в виде пакета.

Но мой вопрос касается Dockerfile. Так должен ли Dockerfile заменить функцию Maven? Должен ли он включать полные инструкции по сборке приложения? Я знаю, что мы по-прежнему извлекаем исходный код из GIT и зависимые библиотеки из Nexus, ссылаясь на них в Dockerfile, но где находится выходной файл .war? Есть ли еще необходимость хранить это в Nexus? Поскольку мы можем создавать версии Docker-контейнеров с помощью некоторых инструментов, таких как OpenShift, и при необходимости выполнять откат, что будет целью сохранения выходного файла .war в Nexus.

Один сценарий, который я могу придумать, связан с исправлениями. Когда доступно исправление ОС / безопасности, мы обновляем базовый образ Docker и перестраиваем образ приложения для конкретного приложения, чтобы применить исправление. Но что происходит с приложением в этом случае? Нужно ли перестраивать приложение каждый раз, когда нам нужно применить патч? Если инструкции по сборке приложения встроены в Dockerfile, и мы должны перестроить образ контейнера приложения, разве приложение также не будет перестроено автоматически? Или Dockerfile может выполнять только определенные инструкции - пропустить сборку части приложения, если код не изменяется, или когда вы указываете пропустить его и т. Д.). Должен ли Dockerfile ссылаться на репозиторий Nexus для файла приложения .war, поэтому в случае, если файл .war не изменяется, он не перестраивается?

Буду признателен за любую помощь.

Спасибо.

1 Ответ

0 голосов
/ 07 мая 2018

Я бы сказал, что было бы неплохо управлять версиями артефактов сборки приложения (war, jar и т. Д.) Отдельно в Nexus, а не выполнять процесс сборки приложения как часть сборки docker. У нас есть похожий конвейер, и способ, которым мы это делаем, таков:

  • Извлечение исходного кода из SCM
  • Сборка с Maven и загрузка артефакта сборки в Nexus для контроля версий
  • Внедрить встроенный артефакт в базовый образ Docker (т.е. openjdk) как часть шага сборки Docker
  • Вставить изображение в реестр
  • CD запускает и развертывает последний образ

Если Dockerfile ссылается на репозиторий Nexus для файла приложения .war, поэтому в случае, если файл .war не изменяется, он не восстановление

Да, это правильно, вы можете использовать команду curl в вашем Dockerfile для загрузки артефактов из Nexus, нет необходимости перестраивать приложение каждый раз, когда вы вносите изменения в ваш Dockerfile.

...