将环境变量传递给容器不起作用

时间:2018-12-23 02:39:24

标签: docker environment-variables

我有以下命令:

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

但是什么也没显示。我原以为会显示“主持人”。

我尝试使用简单引号,双引号和不带引号。

我想念什么?我需要在my_aplication的Dockerfile中指定ENV参数吗?

如果我这样做:

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

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

1 个答案:

答案 0 :(得分:4)

这里有几层东西:

  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端安装一个外壳程序

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也是一样,但是以这种方式使用它可能是一个错误