根据docker中的其他环境变量在env文件中设置环境变量

时间:2017-08-28 16:28:32

标签: docker

我有go的基本图片。此图片具有默认变量$GOPATH=/go 现在我想从这个图像中启动一个容器:

$ docker run -env-file ./myenvfile go

myenvfile的内容是

TEST=$GOPATH/other/path

当我启动容器并执行echo $TEST时,输出为$GOPATH/other/path,而我希望/go/other/path

是否可以在docker的env-file中重用现有的环境变量?

1 个答案:

答案 0 :(得分:0)

AFAIK这是不可能的,因为Docker不对这些变量应用替换。但是,您可以在容器中手动执行此操作。 YMMV,我用命令行参数进行了测试。

$ docker run -it --rm -e TEST1="my-path" -e TEST2='$TEST1/test' ubuntu bash
root@050cb6f12749:/# echo "$TEST1"
my-path
root@050cb6f12749:/# echo "$TEST2"
$TEST1/test

$TEST1在输出中,因为bash解释了您在命令行中写入的内容,但不解释变量中的内容。因此,添加eval会解析$TEST

root@050cb6f12749:/# eval echo "$TEST2"
my-path/test

echo"$TEST2"是此处eval的参数。但在执行eval之前,$TEST2被bash替换为$TEST1/test。因此,echo$TEST1/test被赋予eval,其解释$TEST1并将其替换为my-path

然而,使用eval会带来一些安全风险,但它开箱即用。还有一个替代方法envsubst,您首先需要安装它:

root@050cb6f12749:/# apt update && apt install -y gettext-base
[...]
root@050cb6f12749:/# echo "$TEST2" | envsubst
my-path/test

由于envsubst无法被劫持以执行任意命令,因此更安全。

您可以在ENTRYPOINT脚本中使用以前的技术以透明方式扩展环境变量,例如(未经测试)

#!/bin/bash

export TEST2=`echo $TEST2 | envsubst`

exec "$@"