【问题标题】:Is there a way to build docker image from two jars such as each jar locates in it's own layer有没有办法从两个 jar 构建 docker 映像,例如每个 jar 位于它自己的层中
【发布时间】:2016-01-02 07:04:27
【问题描述】:

我正在使用 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)都将位于一个单独的层中? 这样就不需要一直下载静态/核心层了。

【问题讨论】:

    标签: scala docker sbt sbt-native-packager


    【解决方案1】:

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

    【讨论】:

    • 感谢您的好建议。但在这种情况下,我应该始终记得更新 coreProject 图像以防发生变化。最好在一个图像中有单独的层,这样所有更新都会自动发生。
    【解决方案2】:

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

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

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

    看看the makeAdd methodmapGenericFilesToDocker,它们本质上是创建 docker 容器内容。

    如果您有一个可行的解决方案,我们很乐意将其添加为原型自动插件。

    【讨论】:

      猜你喜欢
      • 2021-10-25
      • 2017-02-11
      • 2011-02-12
      • 2020-01-25
      • 2021-08-22
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多