有没有办法从两个罐子里建立码头图像,比如每个罐子都位于它自己的层中

时间:2015-10-05 14:59:53

标签: scala docker sbt sbt-native-packager

我使用sbt-native-packager和DockerPlugin构建应用程序。 这个应用程序包含两个项目:一个是频繁更改,另一个几乎是静态的。 Build看起来像这样:

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 个答案:

答案 0 :(得分:1)

你可以手动完成,没有sbt-native-packager。您可以使用Dockerfile创建包含核心工件的coreProject映像。然后为servicesProject创建一个基于coreProject映像的不同Dockerfile,并包含经常更改的工件。然后,您可以经常重建servicesProject图像,下载将更小。

答案 1 :(得分:1)

这是一个常见问题,我们尚未为此实施解决方案。通过在静态和非静态中拆分依赖关系并创建单独的层以便缓存静态层,有an attempt来解决单个构建问题。

SBT Native Packager API能够处理此用例。基本思路如下

  • 将您的库依赖项拆分为静态和非静态
  • mappings in Docker设置
  • 中创建两个添加命令
  • 添加命令添加到同一目录

查看the makeAdd methodmapGenericFilesToDocker,它们基本上会创建泊坞广告容器内容。

如果你有一个可行的解决方案,我们很乐意添加一个原型autoplugin。