首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用sbt-docker和sbt-程序集创建一个全合一的码头映像。

如何使用sbt-docker和sbt-程序集创建一个全合一的码头映像。
EN

Stack Overflow用户
提问于 2015-05-21 14:55:32
回答 1查看 1.2K关注 0票数 2

我使用sbt-程序集获得脂肪罐,并使用sbt创建和推送对接图像。我的项目是多个模块,它有多个web服务、UI、数据库等。由于我的基本坞映像很大(800米),我想要创建一个包含所有脂肪罐的对接映像,这样我就可以使用一台普通的机器轻松地在云中进行测试。我把这个解决方案称为“全法塔尔斯合一”(AFIO).我有困难建立这样的AFIO码头形象,因此,这篇文章。

假设这个多模块项目有模块根和mod1,下面是build.scala:

代码语言:javascript
复制
val exeProjs = Seq(mod1)

lazy val root = Project("root", file(".")).
  enablePlugins(DockerPlugin).
  aggregate(exeProjs.map(_.project): _*).
  dependsOn(exeProjs.map(_ % "compile->test"): _*).
  settings(basicSettings: _*).
  settings(
    docker <<= docker dependsOn assembly,
    dockerfile in docker := {
      //get root artifact path like 
      // /home/me/root/target/scala-2.11/root-assembly-0.1-SNAPSHOT.jar 
      val parentArtifact = (assemblyOutputPath in assembly).value

      new Dockerfile {
        from("java:8")
        exeProjs.map(proj => {
          val projName = proj.id

          // fullPathToMod1Art will be like
          // /home/me/root/mod1/target/scala-2.11/mod1-assembly-0.1-SNAPSHOT.jar 
          fullPathToMod1Art = { NASTY parsing to get mo1 artifact }               

          val artifactTargetPath = s"/app/$projName/$artifact"
          addRaw(fullPathArt, artifactTargetPath)
      })
    }
  }

  imageNames in docker := Seq(
    ImageName("myaccount/root:v1")
  )
)

lazy val mod1 = Project("mod1", file("mod1")).
  enablePlugins(DockerPlugin).
  settings(basicSettings: _*).
  settings(
  libraryDependencies ++= Seq(spray_can, spray_routing, akka_actor, junit),

  docker <<= docker dependsOn assembly,

  dockerfile in docker := {
    val artifact = (assemblyOutputPath in assembly).value
    val artifactTargetPath = s"/app/${artifact.name}"
    new Dockerfile {
      from("java:8")
      add(artifact, artifactTargetPath)
      entryPoint("java", "-jar", artifactTargetPath)
    }
  },

  imageNames in docker := Seq(
    ImageName("myaccount/mod1:v1")
  )
)

问题:

  1. 上面的代码不起作用,因为根模块找不到mod1工件,即使我已经验证了fullPathToMod1Art对于生成的mod1工件是正确的。我通过编译->测试指定了根dependsOn mod1,因为我不知道更好地描述需要的其他配置:根的停靠器映像的创建取决于mod1胖jar的生成。
  2. 正如您所看到的,在根模块设置中有一些讨厌的路径解析来获取mod1工件路径。一定有更好的办法。

问题:

如果solved +sbt-装配解决方案支持AFIO模型,那么如何正确地解决上述两个问题?如果他们不支持,还有什么其他插件可以帮助?

感谢你提供任何线索。

EN

回答 1

Stack Overflow用户

发布于 2015-05-25 11:36:15

由于您希望使用来自子项目的程序集输出,所以您应该使根项目中的docker任务依赖于子项目中的assembly任务:

代码语言:javascript
复制
docker <<= docker.dependsOn(assembly in mod1, assembly in mod2)

目前您有docker <<= docker dependsOn assembly,它将为根项目生成一个胖JAR。

您还可以为您的子项目获取如下的程序集输出路径:

代码语言:javascript
复制
val jarFile = (outputPath in assembly in mod1).value

希望这能解决你的问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30377367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档