2017-04-12 3 views
0

Wir sind ein einfaches Dockerfile zu schaffen, die letzte Zeile der Datei istENTRYPOINT mit Umgebungsvariablen nicht acepting neu params

ENTRYPOINT ["sh", "-c", "spark-submit --master $SPARK_MASTER script.py"] 

Die script.py ein einfach pyspark App ist (ist für diese Diskussion nicht wichtig), das pyspark App erhält einige Parameter, die wir mit dem docker Befehl übergeben versuchen wie folgt

docker run --rm my_spark_app_image --param1 something --param2 something_else 

Aber script.py ist kein Parameter bekommen, dh der Container ausgeführt:

spark-submit --master $SPARK_MASTER script.py 

Das erwartete Verhalten ist, dass der Behälter führt:

spark-submit --master $SPARK_MASTER script.py --param1 something --param2 something_else 

Was mache ich falsch?

Antwort

2

Die /bin/sh -c nimmt nur ein Argument, das Skript ausgeführt werden. Alles nach diesem Argument ist eine Shell-Variable $0, $1 usw., die vom Skript analysiert werden kann. Während Sie dies mit der /bin/sh -c Syntax tun können, ist es peinlich und wird nicht mit Ihnen in der Zukunft wachsen.

Anstatt zu versuchen, die Variablen dort zu analysieren, würde ich dies in eine entrypoint.sh bewegen, die Sie in Ihrem Bild enthalten:

#!/bin/sh 
exec spark-submit --master $SPARK_MASTER script.py "[email protected]" 

Und dann die Dockerfile ändern zu definieren:

COPY entrypoint.sh /entrypoint.sh 
ENTRYPOINT ["/entrypoint.sh"] 

Die Syntax exec ersetzt das Shell-Skript in PID 1 durch den Spark-Submit-Prozess, mit dem Signale weitergeleitet werden können. Die "[email protected]" wird alle Argumente von docker run übergeben, wobei jedes arg zitiert wird, falls Sie Leerzeichen in den Parametern haben. Und da es von einem Shell-Skript ausgeführt wird, wird $SPARK_MASTER erweitert.