如何使sbt-native-packager结合两层docker镜像

时间:2015-09-30 12:31:16

标签: scala docker sbt sbt-native-packager

我正在使用sbt-native-packager从Scala应用程序构建docker镜像。 结果图像中有两个相似大小的图层:

docker history --no-trunc docker.example.com/scala-app

...
b49580a36beb6c7cd020ad006954f245aebf82041d3e79eff1517fdbf58ae6cd   About an hour ago   chown -R daemon:daemon . 125.2 MB             
f12b3a929ded4161044642e117114b57889613d77186a0a727862ab5a44af5e3   About an hour ago   /bin/sh -c #(nop) ADD dir:678c325d24285ae96f682c6abc3d71cc8a17ee6267a2db4fff232fcaaa5dec13 in /opt  125.2 MB
...           

我假设这两个层仅在所有权方面有所不同(chown -R守护程序:守护程序。)。问题是它们都是在拉动期间下载的。 有两种方法可以将这两个层合并为一个图像尺寸吗?

1 个答案:

答案 0 :(得分:1)

我设法通过覆盖dockerCommands来改变这种行为:

 lazy val root = myProject("scala-app", ".")
    .enablePlugins(JavaAppPackaging, DockerPlugin).settings(dockerSettings: _*)
    .settings(dockerCommands in Docker := dockerCommands.value.filterNot {
      // remove chown command because it creates redundant image layer
      case ExecCmd("RUN", args @ _*) => args.contains("chown")
      // don't filter the rest
      case cmd                       => false
    })

此解决方案在http://www.scala-sbt.org/sbt-native-packager/formats/docker.html#remove-commands的DockerPlugin文档中进行了描述。