我使用sbt-程序集获得脂肪罐,并使用sbt创建和推送对接图像。我的项目是多个模块,它有多个web服务、UI、数据库等。由于我的基本坞映像很大(800米),我想要创建一个包含所有脂肪罐的对接映像,这样我就可以使用一台普通的机器轻松地在云中进行测试。我把这个解决方案称为“全法塔尔斯合一”(AFIO).我有困难建立这样的AFIO码头形象,因此,这篇文章。
假设这个多模块项目有模块根和mod1,下面是build.scala:
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")
)
)问题:
问题:
如果solved +sbt-装配解决方案支持AFIO模型,那么如何正确地解决上述两个问题?如果他们不支持,还有什么其他插件可以帮助?
感谢你提供任何线索。
发布于 2015-05-25 11:36:15
由于您希望使用来自子项目的程序集输出,所以您应该使根项目中的docker任务依赖于子项目中的assembly任务:
docker <<= docker.dependsOn(assembly in mod1, assembly in mod2)目前您有docker <<= docker dependsOn assembly,它将为根项目生成一个胖JAR。
您还可以为您的子项目获取如下的程序集输出路径:
val jarFile = (outputPath in assembly in mod1).value希望这能解决你的问题。
https://stackoverflow.com/questions/30377367
复制相似问题