将args传递给Dockerfile中的python脚本

时间:2019-09-09 15:38:31

标签: python-2.7 docker docker-compose dockerfile

我希望能够将args从docker-compose文件> dockerfile传递到稍后运行到接受参数的python脚本的CMD / ENTRYPOINT

ARG INSTANCE_NUM
ENV INSTANCE_NUM=$INSTANCE_NUM
RUN echo $INSTANCE_NUM
ARG TOTAL_INSTANCES
ENV TOTAL_INSTANCES=$TOTAL_INSTANCES
RUN echo $TOTAL_INSTANCES

CMD ["python", "test.py", "$INSTANCE_NUM", 
"$TOTAL_INSTANCES"]

在运行内部版本时,     RUN echo $ INSTANCE_NUM 和     RUN回声$ TOTAL_INSTANCES 打印在docker-compose文件中设置的实际值,但

当前结果是python脚本按原样接受ARGS,而不接受docker-compose文件中给出的值。 例如,如果打印出其str $ INSTANCE_NUM或str $ TOTAL_INSTANCES 我希望能够获取我在docker-compose文件中为传递的ARG设置的实际值。

请协助,也许我在这里遗漏了一些东西,或者只是没有正确理解。

谢谢!

1 个答案:

答案 0 :(得分:2)

Docker不会像您在CMD中传递的那样将它们视为环境变量,因为CMD是作为docker命令运行的,并且不涉及shell,因此没有shell意味着没有变量插值,因此直到您指定执行为一个外壳。

ARG INSTANCE_NUM
ENV INSTANCE_NUM=$INSTANCE_NUM
RUN echo $INSTANCE_NUM
ARG TOTAL_INSTANCES
ENV TOTAL_INSTANCES=$TOTAL_INSTANCES
RUN echo $TOTAL_INSTANCES

CMD ["sh", "-c", "python test.py $INSTANCE_NUM $TOTAL_INSTANCES"]

第二件事是您不能在CMD中使用build args,因为CMD应该在引导时运行。

因此它将无法正常工作,只会按原样打印。

ARG INSTANCE_NUM
RUN echo $TOTAL_INSTANCES
CMD ["python","$INSTANCE_NUM"]

要消耗变量,需要在CMD中指定shell。

ARG INSTANCE_NUM
ENV INSTANCE_NUM=$INSTANCE_NUM
CMD ["sh", "-c", "echo $INSTANCE_NUM; python $INSTANCE_NUM"]

使用ARG构建,或者您可以在运行时替代。

 docker build --build-arg INSTANCE_NUM=testargs -t mypy .

运行

docker run -it mypy

或者,如果您在构建时错过了,现在可以在运行时覆盖。

 docker run  -e INSTANCE_NUM=overide_value -it mypy 

使用docker-compose可以完成同一件事

version: "3"
services:
 mongo:
   image: mypy
   environment:
     - INSTANCE_NUM=overide_from_compose