在docker run命令中传递环境变量

9

有没有办法通过变量传递参数?例如,在entrypoint.sh文件中使用ENV animals="turtle, monkey, goose",我想传递一个动物列表。

但是我想在运行容器时传递不同的动物列表,例如: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个回答

10
看起来您可能会混淆镜像构建和容器运行。如果两者之间的区别不是很清楚,建议您查看一些其他问题和文档,例如:
- Docker中容器和镜像有什么区别?(链接:https://dev59.com/cmEi5IYBdhLWcg3wNqHN) - Dockerfile最佳实践(链接:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
RUN echo "${FILENAME} ${animals}" > ./entrypoint.sh

通过上述操作,变量将在镜像构建期间被扩展。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,以明确表示使用的是Ash shell。然后运行脚本时,请不要用镜像名称后面的参数覆盖命令。相反,应该使用适当的标志设置环境变量来运行脚本。
docker run -it -e animals="mouse,rat,kangaroo" image 

4

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

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的答案详细介绍了如何在您的情况下实现此操作,其中构建和执行都涉及相关逻辑。

参考资料

请参阅此处的文档。


它无法正常工作,我正在尝试以下代码 `FROM ubuntu:xenialRUN echo "echo meow ${animals}" > ./entrypoint.shRUN chmod +rwx ./entrypoint.shCMD [ "/bin/bash", "./entrypoint.sh" ]`并运行以下命令,但不会打印动物 docker run --env animals="ducks n goats" animals1。它只会打印 meow。 - soniccool
似乎没有通过动物测试?@Will Cain - soniccool
@soniccool 我明白了,抱歉,看看BMitch的答案来解决构建与执行的问题。我已经从我的答案中删除了关于容器内变量使用的先前指导,这是过于简化了。我没有意识到你正在尝试在构建中使用它们。 - Will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接