在docker run命令中传递ENV

时间:2018-10-30 20:11:51

标签: docker dockerfile

有没有一种可以传递变量的方法,可以说在此示例中,我想使用ENV animals="turtle, monkey, goose"将动物列表传递到entrypoint.sh文件中

但是我希望在运行容器时能够传递不同的动物,例如docker run -t image animals="mouse,rat,kangaroo"

在运行docker run命令时如何传递参数?

目标是在使用docker run命令时获取该变量并将其插入该entrypoint.sh文件

现在我将其硬编码到我的Dockerfile中。但是我希望能够在运行docker run命令时执行此操作,因此我不必总是更改Dockerfile。

FROM anapsix/alpine-java:8u121b13_jdk

ENV FILE_NAME="file_to_run.zip"

ENV animals="turtle, monkey, goose"

ADD ${FILE_NAME} .

RUN echo "${FILENAME} ${animals}" > ./entrypoint.sh    

CMD [ "/bin/ash", "./entrypoint.sh" ]

2 个答案:

答案 0 :(得分:2)

似乎您可能将映像构建与容器运行混淆了。如果两者之间的区别尚不明确,建议您查看其他一些问题和文档,例如:

In Docker, what's the difference between a container and an image? https://docs.docker.com/develop/develop-images/dockerfile_best-practices/


repartition(1)

使用上述方法,变量将在映像构建期间扩展。 entrypoint.sh将不包含RUN echo "${FILENAME} ${animals}" > ./entrypoint.sh 。相反,它将包含

${FILENAME} ${animals}

构建完成后,file_to_run.zip turtle, monkey, goose 命令将根据该图像创建一个容器,并使用已定义但未使用的环境变量运行上述脚本,因为该脚本已经扩展了变量。为防止变量扩展,您需要转义docker run或使用单引号防止扩展,例如

$

RUN echo "\${FILENAME} \${animals}" > ./entrypoint.sh

我还建议在此脚本顶部使用RUN echo '${FILENAME} ${animals}' > ./entrypoint.sh 进行显式显示。然后,当您运行脚本时,请不要在映像名称后使用参数覆盖命令。而是使用适当的标志设置环境变量以运行:

#!/bin/ash

答案 1 :(得分:0)

最简单的方法是转发单个变量:

docker run ... --env animals="turtle, monkey, goose" --env FILE_NAME="file_to_run.zip"

使用文件转发多个变量:

或者,如果您需要从外部获取所有环境变量,则可以先执行以下操作:

printenv | grep -E 'animals|FILE_NAME' > my-env

grep是因为Docker不喜欢某些变量,例如里面有空间,您可能在实际环境中有空。

然后在Docker命令中使用该文件:

docker run ... --env-file ./my-env

如果您要避免将环境变量发送到日志(例如敏感变量),则后者也很有用。我在运行某些脚本的CI / CD管道中使用了这种方法。

在Docker内部使用变量

无论采用哪种方法,环境变量实际上都可以供容器内运行的脚本使用。

@BMitch的答案提供了有关如何在您的情况下实现此目标的更完整的详细信息,在这种情况下,您在构建和执行方面都有相关的逻辑。

参考

请参阅文档here