私は太い瓶でDockerイメージを構築しています。 jarを構築するにはsbt-assembly
プラグインを使用し、Dockerイメージを構築するにはsbt-native-packager
を使用します。私はSBTにあまり精通しておらず、次の問題に取り組んでいます。SBT:脂肪瓶をドッキングする方法は?
私はそれが画像に付加される前脂肪ジャーが作成されるように、
docker:publish
タスクからassembly
タスクの依存関係を宣言したいと思います。私はdocの指示通りしましたが、うまくいきません。私が呼び出すまでassembly
は実行されません。イメージの構築の手順のpublish := (publish dependsOn assembly).value
一つは、脂肪のjarファイルをコピーしています。アセンブリプラグインは
target/scala_whatever/projectname-assembly-X.X.X.jar
にjarを作成するので、正確なscala_whatever
とjarの名前を知る必要があります。アセンブリにはキーがあるようですassemblyJarName
しかし、私はそれにアクセスする方法がわかりません。私は失敗した以下を試しました。Cmd("COPY", "target/scala*/*.jar /app.jar")
ヘルプ!デフォルトは私もエントリポイントを上書きするので、私は必要としないスクリプトのカップルを追加しますので、私は完全にドッキングウィンドウのコマンドを上書き
enablePlugins(JavaAppPackaging, DockerPlugin)
assemblyMergeStrategy in assembly := {
case x => {
val oldStrategy = (assemblyMergeStrategy in assembly).value
val strategy = oldStrategy(x)
if (strategy == MergeStrategy.deduplicate)
MergeStrategy.first
else strategy
}
}
// Remove all jar mappings in universal and append the fat jar
mappings in Universal := {
val universalMappings = (mappings in Universal).value
val fatJar = (assembly in Compile).value
val filtered = universalMappings.filter {
case (file, name) => !name.endsWith(".jar")
}
filtered :+ (fatJar -> ("lib/" + fatJar.getName))
}
dockerRepository := Some("username")
import com.typesafe.sbt.packager.docker.{Cmd, ExecCmd}
dockerCommands := Seq(
Cmd("FROM", "username/spark:2.1.0"),
Cmd("WORKDIR", "/"),
Cmd("COPY", "opt/docker/lib/*.jar", "/app.jar"),
ExecCmd("ENTRYPOINT", "/opt/spark/bin/spark-submit", "/app.jar")
)
:私自身の質問には、次の作品に答える
これはドキュメントの例です。小さなヒント: 'enablePlugins(...)'の 'DockerPlugin'を削除することができます。 'JavaAppPackaging'はデフォルトでそれを可能にします。 – Muki
@Muki文書からは正確ではありません。このドキュメントでは廃止予定の 'jarName'を使用していますが、Dockerコンテナとしてfat jarの例はありませんが、個々の部分のみです。しかし、はい、私は医師からアイデアを得ました。 デフォルトのエントリポイントとして機能するスクリプトの生成を停止する方法があるとしますか?私はそれらを含んでいませんが、 'opt/docker/bin'にローカルで生成されています。 –