【问题标题】:ENTRYPOINT with environment variables is not acepting new params带有环境变量的 ENTRYPOINT 不接受新参数
【发布时间】:2017-09-08 22:12:32
【问题描述】:

我们正在创建一个简单的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

我做错了什么?

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-06-12
      • 1970-01-01
      • 2022-01-15
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      相关资源
      最近更新 更多