2015-10-05 1 views
1

Я использую 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) будет находиться в отдельном слое? В этом случае не будет необходимости загружать статический/основной слой все время.

ответ

1

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

+0

Спасибо за хороший совет. Но в этом случае я всегда должен помнить об обновлении образа coreProject в случае изменений. Было бы неплохо иметь отдельные слои на одном изображении, чтобы все обновления происходили автоматически. – alson

1

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

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

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

Посмотрите на the makeAdd method и mapGenericFilesToDocker, которые по существу создают содержимое контейнера докера.

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