Есть ли способ построить образ докера из двух jar-файлов, например, каждый jar находится в своем собственном слое

Я использую sbt-native-packager вместе с DockerPlugin для создания приложения. Это приложение состоит из двух проектов: один часто меняется, а другой почти статичен. Сборка выглядит так:

lazy val root = myProject("my-backend", ".")
  .enablePlugins(JavaAppPackaging, DockerPlugin).settings(dockerSettings: _*)
  .settings(dockerExposedPorts in Docker := List(80, 8080))
  .dependsOn(servicesProject, coreProject)
  ...

Есть ли способ построить образ Docker, где каждый из проектов (servicesProject, coreProject) будет находиться в отдельном слое? В этом случае не нужно будет постоянно загружать статический / основной слой.

2 ответа

Это общая проблема, и мы еще не реализовали решение для этого. Была попытка решить эту проблему для отдельных сборок путем разделения зависимостей на статические и нестатические и создания отдельных слоев для кэширования статического слоя.

API-интерфейс SBT Native Packager способен обрабатывать этот вариант использования. Основная идея заключается в следующем

  • разделить библиотечные зависимости на статические и нестатические
  • создать две команды добавления из mappings in Docker установка
  • обе команды add добавляют в один и тот же каталог

Взгляните на метод makeAdd и mapGenericFilesToDocker, которые по сути создают содержимое контейнера Docker.

Если у вас есть рабочее решение, мы будем рады добавить этот автоплагин архетипа.

Вы можете сделать это вручную, без sbt-native-packager. Вы можете использовать Dockerfile для создания образа coreProject, который содержит ваши основные артефакты. Затем создайте другой файл Docker для servicesProject, который основан на образе coreProject и содержит часто изменяющиеся артефакты. Затем вы можете часто перестраивать образ servicesProject, и загрузка будет меньше.

Другие вопросы по тегам