2

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")
  )
)

問題:

  1. 生成された mod1 アーティファクトに対して fullPathToMod1Art が正しいことを確認したにもかかわらず、ルート モジュールが mod1 アーティファクトを見つけることができないため、上記のコードは機能しません。root の docker イメージの作成は mod1 の fat jar の生成に依存しています。

  2. ご覧のとおり、ルート モジュール設定で mod1 アーティファクト パスを取得するための厄介なパス解析があります。もっと良い方法があるはずです。

質問:

sbt-docker + sbt-assembly ソリューションが AFIO モデルをサポートしている場合、上記の 2 つの問題を適切に解決するにはどうすればよいですか? それらがサポートしていない場合、他のどのプラグインが役立ちますか?

手がかりに感謝します。

4

1 に答える 1