2017-03-05 2 views
1

Ich baue ein Docker Bild mit einem fetten Glas. Ich verwende das sbt-assembly-Plugin, um das Glas zu bauen, und das sbt-native-packager, um das Docker-Bild zu erstellen. Ich bin mit SBT nicht sehr vertraut und stoße auf die folgenden Probleme.SBT: Wie man ein Fettglas Dockerize?

  1. Ich mag eine Abhängigkeit von der assembly Aufgabe aus der docker:publish Aufgabe erklären, so dass das Fett Glas erstellt wird, bevor es zu dem Bild hinzugefügt wird. Ich habe wie in der doc angewiesen, aber es funktioniert nicht. assembly läuft nicht, bis ich es aufruft.

    publish := (publish dependsOn assembly).value

  2. Einer der Schritte in das Bild Aufbau kopiert das Fett Glas. Da das Assembly-Plugin das Glas in target/scala_whatever/projectname-assembly-X.X.X.jar erstellt, muss ich den genauen scala_whatever und den Jar-Namen kennen. Assembly scheint einen Schlüssel assemblyJarName zu haben, aber ich bin mir nicht sicher, wie man darauf zugreift. Ich habe folgendes versucht, was fehlschlägt.

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

Hilfe!

Antwort

2

Beantwortung meiner eigenen Fragen, die folgenden Werke:

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

ich die Docker Befehle vollständig überschreiben, da die Standardwerte paar Skripte hinzufügen, die ich nicht brauche, weil ich den Einstiegspunkt als auch überschreiben. Außerdem ist das Standardarbeitsverzeichnis /opt/docker, wo ich das Fettglas nicht platzieren möchte. Beachten Sie, dass die Standardbefehle von show dockerCommands in der SBT-Konsole angezeigt werden.

+0

Ja. Dies ist das Beispiel aus der Dokumentation. Ein kleiner Hinweis: Sie können das 'DockerPlugin' in' enablePlugins (...) 'entfernen. Das 'JavaAppPackaging' aktiviert es standardmäßig. – Muki

+0

@Muki Nicht genau aus dem doc. Das Dokument verwendet veralteten 'jarName' und hat kein Beispiel für Fettglas als Docker-Container, sondern nur einzelne Stücke. Aber ja, ich habe die Idee vom Doc bekommen. Können Sie sagen, ob es eine Möglichkeit gibt, die Erstellung von Skripts zu stoppen, die als Standardeinstiegspunkt dienen? Ich schließe sie nicht ein, aber sie werden immer noch in 'opt/docker/bin' lokal generiert. –

Verwandte Themen