带环境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将被扩展。