带环境variables的入口并不是一个新的参数
我们正在创build一个简单的Dockerfile
,该文件的最后一行是
ENTRYPOINT ["sh", "-c", "spark-submit --master $SPARK_MASTER script.py"]
script.py
是一个简单的pyspark应用程序(对于这个讨论不重要),这个pyspark应用程序接收一些参数,我们试图通过使用docker命令如下
docker run --rm my_spark_app_image --param1 something --param2 something_else
但script.py
没有得到任何参数,即执行的容器:
spark-submit --master $SPARK_MASTER script.py
预期的行为是容器执行:
spark-submit --master $SPARK_MASTER script.py --param1 something --param2 something_else
我究竟做错了什么?
/bin/sh -c
只需要一个参数,脚本就可以运行。 这个参数之后的所有东西都是一个shellvariables$0
, $1
等,可以被脚本parsing。 虽然你可以使用/bin/sh -c
语法来做到这一点,但是这样做会很尴尬,将来也不会随着你的增长而增长。
我没有试图parsing那些variables,而是将其移入一个您包含在图像中的entrypoint.sh中:
#!/bin/sh exec spark-submit --master $SPARK_MASTER script.py "$@"
然后更改Dockerfile来定义:
COPY entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
exec
语句用spark-submit进程replacePID 1中的shell脚本,该进程允许信号通过。 "$@"
将通过docker run
任何parameter passing,每个参数引用以防参数中有空格。 由于它是由shell脚本运行的,所以$SPARK_MASTER
将被扩展。