在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-path
replace它。
然而,使用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 "$@"
- xtightvncviewer ConnectToTcpAddr:连接:拒绝连接
- 无法在主机上创buildnode_modules文件夹并将主机文件夹装载到容器
- Meteor(MUP)与Docker自动构build完全一样吗?
- Docker:能够从主机远程login远程机器,但不能从容器远程login
- docker git repo如何在pull请求中显示不同的标签,比如status / need-review
- 无法访问部署在AWS容器实例上的artifactory控制台
- 如何让docker应用程序发送日志到openshift的内置日志聚合器?
- 需要将这个相对简单的docker pull和run命令转换成docker-compose.yml文件?
- 无法login到Nexus 3 dockerregistry