2017-03-05 11 views
1

私は太い瓶でDockerイメージを構築しています。 jarを構築するにはsbt-assemblyプラグインを使用し、Dockerイメージを構築するにはsbt-native-packagerを使用します。私はSBTにあまり精通しておらず、次の問題に取り組んでいます。SBT:脂肪瓶をドッキングする方法は?

  1. 私はそれが画像に付加される前脂肪ジャーが作成されるように、docker:publishタスクからassemblyタスクの依存関係を宣言したいと思います。私はdocの指示通りしましたが、うまくいきません。私が呼び出すまでassemblyは実行されません。イメージの構築の手順の

    publish := (publish dependsOn assembly).value

  2. 一つは、脂肪の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") 
) 

:私自身の質問には、次の作品に答える

答えて

2

。また、デフォルトのworkdirは/opt/dockerです。これは、私がファットジャーを入れたい場所ではありません。 デフォルトのコマンドは、SBBコンソールでshow dockerCommandsと表示されています。

+0

これはドキュメントの例です。小さなヒント: 'enablePlugins(...)'の 'DockerPlugin'を削除することができます。 'JavaAppPackaging'はデフォルトでそれを可能にします。 – Muki

+0

@Muki文書からは正確ではありません。このドキュメントでは廃止予定の 'jarName'を使用していますが、Dockerコンテナとしてfat jarの例はありませんが、個々の部分のみです。しかし、はい、私は医師からアイデアを得ました。 デフォルトのエントリポイントとして機能するスクリプトの生成を停止する方法があるとしますか?私はそれらを含んでいませんが、 'opt/docker/bin'にローカルで生成されています。 –

関連する問題