有没有办法我们可以传递一个变量让我们在这个例子中说我想使用 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" ]
Run Code Online (Sandbox Code Playgroud)
看起来您可能将镜像构建与容器运行混淆了。如果两者之间的区别不是很明显,我建议您查看其他一些问题和文档,例如:
在 Docker 中,容器和镜像有什么区别? https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
RUN echo "${FILENAME} ${animals}" > ./entrypoint.sh
Run Code Online (Sandbox Code Playgroud)
有了上述内容,变量将在映像构建期间扩展。entrypoint.sh 将不包含${FILENAME} ${animals}. 相反,它将包含
file_to_run.zip turtle, monkey, goose
Run Code Online (Sandbox Code Playgroud)
构建后,该docker run命令将从该映像创建一个容器,并使用已定义但从未使用过的环境变量运行上述脚本,因为该脚本已经扩展了变量。为了防止变量扩展,您需要转义$或使用单引号来防止扩展,例如
RUN echo "\${FILENAME} \${animals}" > ./entrypoint.sh
Run Code Online (Sandbox Code Playgroud)
或者
RUN echo '${FILENAME} ${animals}' > ./entrypoint.sh
Run Code Online (Sandbox Code Playgroud)
我还建议#!/bin/ash在此脚本的顶部使用 a 进行明确。然后当你运行脚本时,不要用图像名称后的参数覆盖命令。而是使用适当的标志设置环境变量以运行:
docker run -it -e animals="mouse,rat,kangaroo" image
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16966 次 |
| 最近记录: |