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

问题描述 投票:0回答:1

这个打印是空白的。

docker run --rm --env HELLO="world" ubuntu:18.04 bash -c "echo $HELLO"

然而,这个工作。

docker run --rm -it --env HELLO="world" ubuntu:18.04 bash
# in the container
echo $HELLO

HELLO 好像是传递给容器的

docker run --rm --env HELLO="world" ubuntu:18.04 env

为什么第一条命令没有看到 HELLO? 我漏了什么?

bash docker ubuntu environment-variables alpine
1个回答
5
投票

因为有双引号。$HELLO 将会在命令执行后,由docker主机本身进行评估,然后再进入容器内部。所以你需要将美元符号($)使用反斜杠(\),它告诉bash的 $ 是命令本身的一部分,不需要由当前shell(在我们的例子中是docker主机)评估,也不需要使用单引号('')这样。

使用单引号

$ docker run --rm --env HELLO="world" ubuntu:18.04 bash -c 'echo $HELLO'
world

使用反斜杠来逃避

$ docker run --rm --env HELLO="world" ubuntu:18.04 bash -c "echo \$HELLO"
world

0
投票

你之所以没有看到你所期望的东西,是因为事情在你期望被评估之前就被评估了。

当你跑。

docker run --rm --env HELLO="world" ubuntu:18.04 bash -c "echo $HELLO"

当你跑的时候... "echo $HELLO" 和bash没有任何区别。

echo "echo $HELLO"

shell (bash)解析双引号(")和它们内部的事物。它看到的是 "echo $HELLO" 并取代变量 $HOME 与它的价值。如果 $HOME 没有定义,这就等于 echo.

所以..,

echo "echo $HELLO"

被你的shell解析和评估。然后在最后运行这个。

echo "echo "

所以 "echo $HELLO" 命令中,你的docker命令被计算为 "echo "那是 传递给docker命令的内容。

你要做的是防止你的shell评估这个变量。您可以通过以下几种方式来实现。

  1. 你可以用单引号代替双引号 You can use single quotes instead of double quotes. 你的shell不会解析它,它将会被传递给 bash 容器内的原样。

    docker run --rm --env HELLO="world" ubuntu:18.04 bash -c 'echo $HELLO'
    
  2. 你可以逃避 $ 以避免在这个shell中对其进行评估,而让 bash 在docker容器内评估它。

    docker run --rm --env HELLO="world" ubuntu:18.04 bash -c "echo \$HELLO"
    
© www.soinside.com 2019 - 2024. All rights reserved.