Docker 带有环境变量的入口点未接受新参数

Docker 带有环境变量的入口点未接受新参数,docker,dockerfile,Docker,Dockerfile,我们正在创建一个简单的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 --pa

我们正在创建一个简单的
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
只接受一个参数,即要运行的脚本。该参数之后的所有内容都是shell变量
$0
$1
,等等,可以由脚本解析。虽然您可以使用
/bin/sh-c
语法来实现这一点,但它很笨拙,将来不会随着您的使用而增长

我不想在这里解析变量,而是将其移动到图像中包含的entrypoint.sh中:

#!/bin/sh
exec spark-submit --master $SPARK_MASTER script.py "$@"
然后更改Dockerfile以定义:

COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
exec
语法将PID 1中的shell脚本替换为spark submit进程,该进程允许信号通过。
“$@”
将通过
docker run
中的任何参数,如果参数中有空格,则每个参数都将被引用。由于它是由shell脚本运行的,
$SPARK\u MASTER
将被扩展