将 ENV 传递给运行单个命令的 Docker 容器

use*_*160 3 bash ubuntu environment-variables docker alpine-linux

这打印空白:

docker run --rm --env HELLO="world" ubuntu:18.04 bash -c "echo $HELLO"
Run Code Online (Sandbox Code Playgroud)

但是这有效:

docker run --rm -it --env HELLO="world" ubuntu:18.04 bash
# in the container
echo $HELLO
Run Code Online (Sandbox Code Playgroud)

HELLO 不过似乎传递给了容器:

docker run --rm --env HELLO="world" ubuntu:18.04 env
Run Code Online (Sandbox Code Playgroud)

为什么第一个命令没有看到HELLO?我错过了什么?

Mos*_*ein 6

由于双引号,$HELLO一旦命令在进入容器之前被执行,docker 主机本身将对其进行评估。因此,您需要$使用反斜杠 ( \)对美元符号 ( ) 进行转义,该反斜杠 ( ) 告诉 bash$是命令本身的一部分,不需要由当前 shell(在我们的示例中为 docker 主机)进行评估,或者使用单引号 ( '') 像这样:

使用单引号

$ docker run --rm --env HELLO="world" ubuntu:18.04 bash -c 'echo $HELLO'
world
Run Code Online (Sandbox Code Playgroud)

使用反斜杠转义

$ docker run --rm --env HELLO="world" ubuntu:18.04 bash -c "echo \$HELLO"
world
Run Code Online (Sandbox Code Playgroud)