riv*_*ar_ 3 python-2.7 docker dockerfile docker-compose
我希望能够将 docker-compose file > dockerfile 中的 Args 传递给运行接受参数的 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 Code Online (Sandbox Code Playgroud)
在运行构建时, RUN echo $INSTANCE_NUM 和 RUN echo $TOTAL_INSTANCES 打印在 docker-compose 文件中设置的实际值,但是
当前的结果是 python 脚本按原样接受 ARGS,而不接受 docker-compose 文件中给出的值。例如,如果打印出它的 str $INSTANCE_NUM 或 str $TOTAL_INSTANCES 我希望能够获得我在 docker-compose 文件中为传递的 ARG 设置的实际值。
请协助,也许我在这里遗漏了一些东西或者只是没有正确理解。
谢谢!
Docker 不会像您在 CMD 中传递的那样将它们视为环境变量,因为 CMD 作为 docker 命令运行并且不会涉及 shell,因此没有 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"]
Run Code Online (Sandbox Code Playgroud)
第二件事你不能使用构建参数,CMD因为CMD它应该在启动时运行。
所以它不会工作,它只会按原样打印。
ARG INSTANCE_NUM
RUN echo $TOTAL_INSTANCES
CMD ["python","$INSTANCE_NUM"]
Run Code Online (Sandbox Code Playgroud)
要消耗变量,需要在CMD.
ARG INSTANCE_NUM
ENV INSTANCE_NUM=$INSTANCE_NUM
CMD ["sh", "-c", "echo $INSTANCE_NUM; python $INSTANCE_NUM"]
Run Code Online (Sandbox Code Playgroud)
使用 ARG 构建,或者您可以在运行时覆盖。
docker build --build-arg INSTANCE_NUM=testargs -t mypy .
Run Code Online (Sandbox Code Playgroud)
跑
docker run -it mypy
Run Code Online (Sandbox Code Playgroud)
或者,如果您在构建时错过了,您现在可以在运行时覆盖。
docker run -e INSTANCE_NUM=overide_value -it mypy
Run Code Online (Sandbox Code Playgroud)
同样的事情可以用 docker-compose 来完成
version: "3"
services:
mongo:
image: mypy
environment:
- INSTANCE_NUM=overide_from_compose
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2426 次 |
| 最近记录: |