通过〜/ .bash_profile或〜/ .bashrc在shell外部设置的环境变量,尽管可以在shell中访问,但它们对docker或env都不会出现。
Bash_profile包含行TEST_ENV_VAR=123
,重启终端后,可以通过$TEST_ENV_VAR
访问该变量,但是docker和env无法访问此环境变量。
Henrys-MacBook-Pro:~ henry$ echo $TEST_ENV_VAR
123
Henrys-MacBook-Pro:~ henry$ docker run -it -e TEST_ENV_VAR ubuntu env | grep TEST_ENV_VAR
Henrys-MacBook-Pro:~ henry$ env | grep TEST_ENV_VAR
终端仍然可以访问它,甚至将其传递给docker:
Henrys-MacBook-Pro:~ henry$ docker run -it -e TEST_ENV_VAR=${TEST_ENV_VAR} ubuntu env | grep TEST_ENV_VAR
TEST_ENV_VAR=123
问题通常与环境变量无关,因为终端中设置的变量按预期工作:
Henrys-MacBook-Pro:~ henry$ export TEST_ENV_VAR=1234
Henrys-MacBook-Pro:~ henry$ docker run -it -e TEST_ENV_VAR ubuntu env | grep TEST_ENV_VAR
TEST_ENV_VAR=1234
我正在运行macOS Mojave,10.14.5,经典终端,docker 19.03.4,ls -al〜:输出
-rw-r--r-- 1 henry staff 455 Nov 12 11:50 .bash_profile
答案 0 :(得分:2)
docker
实际上并不启动容器。而是向Docker引擎发送一条消息(在与执行docker
的环境无关的单独环境中运行),请求 it 为您启动一个容器。因此,新容器不会在您当前的Shell环境中继承任何变量。
尝试TEST_ENV_VAR=${TEST_ENV_VAR}
时,您明确地告诉docker
创建一个名为TEST_ENV_VAR
的环境变量,并使用扩展TEST_ENV_VAR
now产生的值,在新容器中,而不是尝试从适当的环境继承该变量。
即使忽略这一点,您实际上也没有使用TEST_ENV_VAR=123
创建环境变量;您只创建了一个普通的shell变量。为了使env
能够看到它,您需要先将其导出。
$ TEST_ENV_VAR=123
$ env | grep TEST_ENV_VAR
$ export TEST_ENV_VAR
$ env | grep TEST_ENV_VAR
TEST_ENV_VAR=123
答案 1 :(得分:1)
.bash_profile适用于您的用户。 Docker在自己的环境中运行(而不是在用户生成的子shell中运行)。导出仅将信息发送到子外壳中。您需要使该变量在更高级别可用。
/etc/environment
在那儿要小心。
或者,您可以考虑要求Docker自己进行这些更改。