2017-01-09 2 views
4

Ich benutze das sbt native Packager Plugin, um eine Zip-Datei meiner Anwendung für den Einsatz in Elastic Beanstalk zu erstellen. Ich möchte Umgebungsvariablen in meiner BeanStalk-Umgebung festlegen und diese verwenden, um meine Anwendung zur Laufzeit zu konfigurieren. Ich habe versucht, wie so die env Variablen in meinem procfile zu verweisen:Umgebungsvariable basierte Laufzeitkonfiguration mit sbt native packager

web: ./bin/bridgeservice -Dhttp.port=$PORT 

Das funktioniert nicht, wie $PORT nicht durch das Startskript interpoliert durch den Verpacker erzeugt.

Ich habe auch die Variablen in meinem build.sbt wie so zu definieren versucht:

import scala.util.Properties 

javaOptions in Universal ++= Seq(
    "-Dhttp.port=" + Properties.envOrElse("PORT", "9004"), 
) 

zum Zeitpunkt der auch funktioniert nicht wie der Verpacker erwartet, dass die PORT env Variable für den Bau des ausschüttbaren Reißverschluss und HardCodes den Standardwert von 9004 in einer application.ini-Datei.

Ist es möglich, Java-Optionen basierend auf Umgebungsvariablen beim Start der Anwendung dynamisch zu übergeben?

+0

Ich habe dies lokal auf einem Ubuntu 16.10 getestet und es funktioniert. Die Interpolation sollte nicht vom Skript ausgeführt werden, sondern von der Shell, die das Skript aufruft. – Muki

+0

Welche Methode hast du benutzt? – novon

+0

Ich baute [dieses Projekt] (https://github.com/muuki88/sbt-native-packager-examples/tree/master/simple-deb) mit 'sbt stage' und nannte das Skript mit' ./target/universal/stage/bin/mukis-application-conf -Dexample.greeting = $ PATH' und alles erschien wie erwartet – Muki

Antwort

0

Nicht sicher, ob dies helfen wird, aber ich hatte ähnliches Problem beim Erstellen von Docker Bilder meines Multi-Modul-Projekts.

ich mit diesem endete:

def sysPropOrDefault(propName: String, default: String): String = Option(System.getProperty(propName)).getOrElse(default) 
val somePort = sysPropOrDefault("port", "9004") 

und in der Projektdefinition:

lazy val someProject = project("some-project") 
    .enablePlugins(JavaServerAppPackaging) 
    .settings(
    javaOptions in Universal ++= Seq(
     s"-Dhttp.port=$somePort" 
    ) 
) 

javaOptions Hinzufügen von Einstellungen Ebene von entscheidender Bedeutung war in meinem Fall zu projizieren. Und vor Option ist kein Tippfehler.

Wenn Befehl vom Terminal laufen, rief ich:

sbt clean update -Dport=9005 docker:publishLocal 
+0

Danke für die Freigabe. Der Kontext für meine Frage war, die Anwendung in aws beansstalk zu starten, so dass dies mein Problem gelöst hat: http://stackoverflow.com/questions/41539466/environment-variables-not-available-in-elastic-beanstalk-procfile – novon

1

Die Einstellungen in javaOptions in Universal in conf/application.ini-Datei kompiliert, sondern entsprechend sbt-native-packager docs application.ini derzeit nicht Variablensubstitution nicht unterstützt:

Die Datei wird in $ {app_home} /conf/application.ini installiert und wird von dort mit dem Startscript gelesen. Sie können # für Kommentare und neue Zeilen verwenden, wie Sie möchten. Diese Datei hat derzeit keine Variable Substitution. Wir empfehlen, die Datei build.sbt zu verwenden, wenn Sie Informationen von Ihrem Build benötigen.

So können die env var basierte Runtime-Einstellungen auf verschiedenen Wegen erreicht werden:

Lösung # 1. Fügen Sie zusätzliche Definitionen generiert Startskript

In build.sbt:

bashScriptExtraDefines += """addJava "-Dhttp.port=${PORT:-9004}"""" 

Check out Application and runtime configuration Dokumentation für weitere Informationen.

Lösung # 2: Set JAVA_OPTS env var in dem Zielserver

Setzen Sie einfach JAVA_OPTS Umgebungsvariable auf dem Zielserver und es für das Startskript zur Verfügung stellen. Dies kann die einfachste Lösung für Umgebungen wie AWS ElasticBeanstalk sein, bei der Umgebungsvariablen auf der Umgebungskonfigurationsseite der App festgelegt werden können.

Verwandte Themen