带有环境变量的ENTRYPOINT并未考虑新的参数

时间:2017-04-12 23:32:40

标签: 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 --param2 something_else

script.py没有获得任何参数,即容器已执行:

 spark-submit --master $SPARK_MASTER script.py

预期的行为是容器执行:

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

我做错了什么?

1 个答案:

答案 0 :(得分:5)

/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_MASTER将被扩展。