为什么环境变量的 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.sh
时 output
是
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
.
打印它们时
- 当我使用例如
echo $FOLDER
它不存在!? -> 见空行
- 当我使用例如
echo $HOSTNAME
它在那里,但具有不同的值!? -> 见“结束”前的行。
那么如何在 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.
我的系统: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.sh
时 output
是
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
.
- 当我使用例如
echo $FOLDER
它不存在!? -> 见空行 - 当我使用例如
echo $HOSTNAME
它在那里,但具有不同的值!? -> 见“结束”前的行。
那么如何在 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.