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

Héc*_*tor 1 environment-variables docker

我有以下命令:

docker run -e "DB_HOST=thehost" --rm my_application echo $DB_HOST
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果我做:

docker run -e "DB_HOST=thehost" --rm my_application echo $PATH
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*aze 5

这里有两层:

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

在第一个例子中

docker run ... echo $DB_HOST
Run Code Online (Sandbox Code Playgroud)

您的本地Shell会在将变量引用传递给Docker之前捕获它。

如果您明确单引号

docker run ... echo '$DB_HOST'
Run Code Online (Sandbox Code Playgroud)

Docker将找到/bin/echo(假设它存在于容器中)并以字符串$DB_HOST作为参数启动它,但是同样,由于Docker方面没有外壳,它会按原样打印该字符串。

您问题的直接答案是强制在Docker端安装一个shell

docker run -e DB_HOST=thehost --rm my_application \
  sh -c 'echo $DB_HOST'
Run Code Online (Sandbox Code Playgroud)

在更高的级别上:

  • 如果你正在运行在其他一些语言编写的程序,而不仅仅是一个shell命令,他们会看到正常的环境(Python的os.environ,Ruby的ENV,节点的process.env等等
  • 如果您有任何复杂的地方,请将其编写到shell脚本中,将其复制到映像中,然后运行可能更易于维护的操作,并隐式涉及shell(第一行会说#!/bin/sh
  • 在您的Dockerfile中,如果您说CMD some command,Docker将自动将其包装在shell中;相当于CMD ["sh", "-c", "some command"]
  • 同样适用于ENTRYPOINT,但是使用这种方式可能是一个错误