Dockerfile:如何用build-arg的replace环境variables中的占位符?

我有一个Web应用程序,我想运行在Docker上进行testing。 应用程序使用数据库作为存储,数据库的configuration保存在环境variables(JSON)中。 下面你可以看到我的Dockerfile中的envvariables定义(另请参见我的方法)

ENV CONFIG '{ \ "credentials":{ \ "hostname": "172.17.0.5", \ "password": "PWD", \ "port": "1234", \ "username": "${USER}" \ }, \ "name":"database", \ "tags":[] \ }, \ ... 

如果我硬编码数据库的所有参数一切正常,但我不想只改变我的Dockerfile,因为数据库的IP地址已经改变。
因此我想使用Docker构build参数。
我已经尝试了两种方法:

  1. 直接引用variables(见“$ {USER}”一行)
  2. 使用以下命令replace“PWD”的占位符RUN CONFIG=$(echo $CONFIG | sed 's/PWD/'$db_pwd'/g')

第一种方法不会导致replace,因此$ {USER}是$ {USER}。 第二种方法似乎工作(至less在terminal),但似乎variables分配不起作用。

你有什么想法我可以做这个工作? 随意build议其他方法。 我只是不想在我的Dockerfile中有硬编码参数。

谢谢!

variables扩展只能在双引号string中工作。 这是工作:

 ENV CONFIG "{ \ \"credentials\":{ \ \"hostname\": \"172.17.0.5\", \ \"password\": \"PWD\", \ \"port\": \"1234\", \ \"username\": \"${USER}\" \ }, \ \"name\":\"database\", \ \"tags\":[] \ }" 

一个简单的例子:

 FROM alpine ENV USER foo ENV CONFIG "{ \ \"credentials\":{ \ \"hostname\": \"172.17.0.5\", \ \"password\": \"PWD\", \ \"port\": \"1234\", \ \"username\": \"${USER}\" \ }, \ \"name\":\"database\", \ \"tags\":[] \ }" ENTRYPOINT env | sort 

_

 $ docker build -t test . $ docker run -it --rm test CONFIG={ "credentials":{ "hostname": "172.17.0.5", "password": "PWD", "port": "1234", "username": "foo" }, "name":"database", "tags":[] } HOME=/root HOSTNAME=43d29bd12bc5 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/ SHLVL=1 TERM=xterm USER=foo