2017-03-05 64 views
1

我正在用一個胖罐子構建一個Docker鏡像。我使用sbt-assembly插件來構建jar,並使用sbt-native-packager來構建Docker鏡像。我對SBT不是很熟悉,並且遇到以下問題。SBT:如何Dockerize一個胖罐子?

  1. 我想聲明的依賴在assembly任務從docker:publish任務,例如之前它添加到圖像中的脂肪罐子被創建。我按照doc的指示進行了操作,但不起作用。 assembly不會運行,直到我調用它。

    publish := (publish dependsOn assembly).value

  2. 一個在建築圖像中的各個步驟複製脂肪罐子。由於彙編插件在target/scala_whatever/projectname-assembly-X.X.X.jar中創建了罐子,我需要知道確切的scala_whatever和罐子名稱。大會似乎有一個關鍵assemblyJarName,但我不知道如何訪問它。我嘗試了以下失敗。

    Cmd("COPY", "target/scala*/*.jar /app.jar")

幫助!

回答

2

回答我自己的問題,以下工作:

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

我完全覆蓋泊塢窗命令,因爲默認添加夫妻,我不需要,因爲我覆蓋入口點以及腳本。另外,默認的工作目錄是/opt/docker,這不是我想放置胖罐子的地方。 請注意,默認命令在sbt控制檯中以show dockerCommands顯示。

+0

是的。這是文檔中的例子。小提示:您可以在'enablePlugins(...)'中刪除'DockerPlugin'。 'JavaAppPackaging'默認啓用它。 – Muki

+0

@Muki不完全來自文檔。該文檔使用不推薦的'jarName',並沒有將胖jar作爲Docker容器的示例,但僅包含單獨的部分。但是,我從文檔中獲得了這個想法。 你可以說如果有辦法停止生成作爲默認入口點的腳本嗎?我不包括它們,但它們仍然在本地生成在'opt/docker/bin'中。 –

相關問題