【问题标题】:Pass ENV in docker run command在 docker run 命令中传递 ENV
【发布时间】:2019-04-03 23:03:22
【问题描述】:

有没有一种方法可以传递变量让我们说在这个例子中我想使用 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" ]

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:

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

    In Docker, what's the difference between a container and an image? 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 进行明确说明。然后在运行脚本时,不要在图像名称后使用参数覆盖命令。而是使用适当的标志设置环境变量以运行:

    docker run -it -e animals="mouse,rat,kangaroo" image 
    

    【讨论】:

      【解决方案2】:

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

      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

      【讨论】:

      • 它不起作用,我现在正在尝试此代码FROM ubuntu:xenial RUN echo "echo meow ${animals}" > ./entrypoint.sh RUN chmod +rwx ./entrypoint.sh CMD [ "/bin/bash", "./entrypoint.sh" ] 并运行此命令但它不打印动物docker run --env animals="ducks n goats" animals1。它只是打印喵
      • 看起来不像是通过动物? @威尔凯恩
      • @soniccool 我明白了,抱歉,看看 BMitch 的答案,用于整理构建与执行。我在我的回答中删除了之前关于在容器中使用变量的指导,这过于简单化了。我没有意识到您正在尝试在构建中使用它们。
      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-21
      • 2021-08-03
      • 2022-08-16
      • 2022-08-04
      • 1970-01-01
      相关资源
      最近更新 更多