为什么环境变量的 echo 不起作用,但 printenv 在 docker 中起作用?

Why does echo of an environment variable do not work, but printenv does, inside a docker?

我的系统:Visual studio 代码开发容器,在 Windows 10.

我尝试在我的 docker 容器中使用环境变量。

一个文件 xyz.env 包含我的环境变量

TOKEN=12345

PROJECT_ID_1=8888
PROJECT_ID_2=9999

FOLDER=./tmp

我有一个shell脚本script.sh

#!/bin/sh

BASEDIR=$(dirname [=12=])

docker run --rm \
    --env-file $BASEDIR/xyz.env \
    alpine:latest \
    printenv && echo "$HOSTNAME" && echo "$FOLDER" && echo "--- END ---"

当我调用 script.shoutput

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=4ddcb55c018f
TOKEN=12345
PROJECT_ID_1=8888
PROJECT_ID_2=9999
FOLDER=./tmp
HOME=/root
072bf158678c

--- END ---

PATH、HOSTNAME、HOME 已经存在(我不介意)

TOKEN、PROJECT_ID_1、PROJECT_ID_2 和 FOLDER 在那里,当我通过 printenv.

打印它们时

那么如何在 docker 容器中使用我的文件中的 ENV 变量?

当我 运行 docker 运行 直接(没有脚本)时,我有相同的行为,比如

docker run --rm \
    --env-file scripts/xyz.env \
    alpine:latest \
    printenv && echo "$HOSTNAME" && echo "$FOLDER" && echo "--- END ---"

很简单,您在 运行 执行命令时使用主机中的变量,就像您为 $BASEDIR 所做的那样。由于它们在您的主机上不存在,因此您的命令如下所示:

docker run --rm \
    --env-file scripts/xyz.env \
    alpine:latest \
    printenv && echo "" && echo "" && echo "--- END ---"

通过使用 \ 转义美元符号,容器应该 运行 使用自己的环境变量的正确命令:

docker run --rm \
    --env-file $BASEDIR/xyz.env \
    alpine:latest \
    printenv && echo "$HOSTNAME" && echo "$FOLDER" && echo "--- END ---"

但是由于 && 这仍然行不通:容器将 运行 printenv,然后您的主机将 运行 echo命令。 你应该 运行 所有这些作为一个命令:

docker run --rm \
    --env-file $BASEDIR/xyz.env \
    alpine:latest \
    /bin/sh -c 'printenv && echo "$HOSTNAME" && echo "$FOLDER" && echo "--- END ---"'

No need for escaping here as the commands are passed as a string with single quote, with no variable expansion from your host.