我们正在创建一个简单的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
我做错了什么?
答案 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
将被扩展。