在docker中根据其他环境variables在env文件中设置环境variables

我有基本的形象go 。 这个图像有默认的variables$GOPATH=/go现在我想从这个图像启动一个容器,像这样:

 $ docker run -env-file ./myenvfile go 

myenvfile的内容是

 TEST=$GOPATH/other/path 

当我启动我的容器,我做了一个echo $TEST的输出是$GOPATH/other/path而我希望/go/other/path

是否有可能在您的docker的env文件中重用现有的环境variables?

AFAIK这是不可能的,因为Docker不会对这些variables应用replace。 但是,您可以在容器中手动执行此操作。 YMMV,我用命令行参数进行了testing。

 $ 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解释你在命令行中写的内容,而不是variables中的内容。 因此,添加eval解决了$TEST

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

echo"$TEST2"eval参数。 但是在执行eval之前, $TEST2$TEST1/test by bashreplace。 因此, echo$TEST1/test被赋予eval ,它将解释$TEST1并用my-pathreplace它。

然而,使用eval带来一些安全风险,但它可以直接使用。 还有一个替代scheme,你首先必须安装:

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

由于envsubst不能被劫持来执行任意命令,因此更安全。

您可以在ENTRYPOINT脚本中使用以前的技术来以透明的方式扩展环境variables,例如(未testing)

 #!/bin/bash export TEST2=`echo $TEST2 | envsubst` exec "$@"