这个打印是空白的。
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
? 我漏了什么?
因为有双引号。$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
你之所以没有看到你所期望的东西,是因为事情在你期望被评估之前就被评估了。
当你跑。
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评估这个变量。您可以通过以下几种方式来实现。
你可以用单引号代替双引号 You can use single quotes instead of double quotes. 你的shell不会解析它,它将会被传递给 bash
容器内的原样。
docker run --rm --env HELLO="world" ubuntu:18.04 bash -c 'echo $HELLO'
你可以逃避 $
以避免在这个shell中对其进行评估,而让 bash
在docker容器内评估它。
docker run --rm --env HELLO="world" ubuntu:18.04 bash -c "echo \$HELLO"