【问题标题】:Passing environment variable to container is not working将环境变量传递给容器不起作用
【发布时间】:2018-12-23 02:39:23
【问题描述】:

我有这个命令:

docker run -e "DB_HOST=thehost" --rm my_application echo $DB_HOST

但它什么也没显示。我期待显示“thehost”。

我试过用单引号、双引号和不带引号。

我错过了什么?我需要在 my_aplication 的 Dockerfile 中指定 ENV 参数吗?

如果我这样做:

docker run -e "DB_HOST=thehost" --rm my_application echo $PATH

它正确显示了 PATH 值。但它忽略了我的环境变量。

【问题讨论】:

    标签: docker environment-variables


    【解决方案1】:

    这里有几层东西:

    1. 您的本地 shell 扩展命令;
    2. 启动一些 Docker 容器;
    3. 运行其他进程(但不一定是 shell)。

    在你的第一个例子中

    docker run ... echo $DB_HOST
    

    您的本地 shell 在变量引用被传递到 Docker 之前捕获它。

    如果你明确地单引号

    docker run ... echo '$DB_HOST'
    

    Docker 将找到 /bin/echo(假设它存在于容器中)并使用字符串 $DB_HOST 作为参数启动它,但同样,由于 Docker 端不涉及 shell,它尽职尽责地将该字符串打印为是。

    你的问题的直接答案是强制在 Docker 端有一个 shell

    docker run -e DB_HOST=thehost --rm my_application \
      sh -c 'echo $DB_HOST'
    

    略高一点:

    • 如果您正在运行其他语言的程序,而不仅仅是一个 shell 命令,它们会正常看到环境(Python 的 os.environ、Ruby 的 ENV、Node 的 process.env等。)
    • 如果您有任何甚至有点复杂的东西,请将其写入 shell 脚本,将其复制到图像中,然后运行可能更易于维护,并且隐含涉及 shell(第一行将显示 #!/bin/sh)李>
    • 在你的 Dockerfile 中,如果你说CMD some command,Docker 会自动将它包装在一个 shell 中;相当于CMD ["sh", "-c", "some command"]
    • ENTRYPOINT 也是如此,但这样使用它可能是一个错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-18
      • 2022-01-16
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 2016-12-08
      • 2021-06-25
      相关资源
      最近更新 更多