sbt-assembly を使用してファット jar を取得し、sbt-docker を使用して docker イメージを作成およびプッシュしています。私のプロジェクトは、複数の Web サービス、UI、データベースなどを持つマルチモジュールです。ベースの Docker イメージが大きい (800M) ため、すべてのファット jar を含む Docker イメージを作成して、クラウドで簡単にテストできるようにしたいと考えています。 1 つの控えめなマシン。私はこのソリューションを All-FatJars-in-One (AFIO) と呼んでいます。このような AFIO docker イメージをビルドするのに問題があるため、この投稿を行います。
このマルチモジュール プロジェクトにモジュール ルートと 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")
)
)
問題:
生成された mod1 アーティファクトに対して fullPathToMod1Art が正しいことを確認したにもかかわらず、ルート モジュールが mod1 アーティファクトを見つけることができないため、上記のコードは機能しません。root の docker イメージの作成は mod1 の fat jar の生成に依存しています。
ご覧のとおり、ルート モジュール設定で mod1 アーティファクト パスを取得するための厄介なパス解析があります。もっと良い方法があるはずです。
質問:
sbt-docker + sbt-assembly ソリューションが AFIO モデルをサポートしている場合、上記の 2 つの問題を適切に解決するにはどうすればよいですか? それらがサポートしていない場合、他のどのプラグインが役立ちますか?
手がかりに感謝します。