我有一个Dockerfile,它的入口点使用ENV变量。我无法将入口点结构化,因此容器还可以接受其他命令行参数。以下是Dockerfile的相关部分:
ARG MODULE_NAME
ENV MODULE_NAME=$MODULE_NAME
ENTRYPOINT /usr/bin/python3 -m ${MODULE_NAME}
如果我只想在没有其他参数的情况下启动容器,那么这很好:
docker run my-image
但我需要能够向python进程传递额外的命令行参数(例如“--debug”标志),如下所示:
docker run my-image --debug
按照上面ENTRYPOINT的形式,“-debug”参数不会传递给python进程。我已经尝试过ENTRYPOINT的exec和shell两种形式,但是无法让它同时使用ENV变量和命令行参数。我还尝试了其他几种形式:
这将运行但不接受其他参数:
ENTRYPOINT ["/bin/bash", "-c", "/usr/bin/python3 -m ${MODULE_NAME}"]
这将给出“/usr/bin/python3:没有名为${module\u NAME}的模块”:
ENTRYPOINT ["/usr/bin/python3", "-m ${MODULE_NAME}"]
这将给出“/usr/bin/python3:没有名为${module\u NAME}的模块”:
ENTRYPOINT ["/usr/bin/python3", "-m", "${MODULE_NAME}"]
似乎无法创建直接支持变量扩展和附加命令行参数的入口点。虽然ENTRYPOINT的shell形式将在运行时展开ENV变量,但它不接受来自
docker run
命令的附加(附加)参数。虽然ENTRYPOINT的exec格式不支持其他命令行参数,但默认情况下它不会创建shell环境,因此ENV变量不会展开。为了解决这个问题,可以在exec表单中显式调用
bash
,以执行一个脚本,该脚本随后展开ENV变量并将命令行参数传递给python进程。下面是一个这样做的Dockerfile示例:docker图片输出:
请注意,变量扩展是在运行命令期间发生的(因为它们使用的是shell形式),因此图像中RUN_script.py的内容是:
如果最终运行命令替换为:
然后run_script.sh将包含
但是来自运行容器的输出将是相同的,因为变量扩展将在运行时发生。第二个版本的潜在好处是,可以重写要在运行时运行的模块,而不替换入口点。
相关问题 更多 >
编程相关推荐