我有一个Web应用程序,我想在Docker上运行以进行测试。 应用程序使用数据库作为存储,并且数据库的配置在环境变量(JSON)中维护。 您可以在下面看到我的Dockerfile中的env变量定义(另请参阅下面的方法)
ENV CONFIG '{ \
"credentials":{ \
"hostname": "172.17.0.5", \
"password": "PWD", \
"port": "1234", \
"username": "${USER}" \
}, \
"name":"database", \
"tags":[] \
}, \
...
如果我对数据库的所有参数进行硬编码,一切正常,但我不想仅仅因为数据库的IP地址发生变化而改变我的Dockerfile。 因此我想使用Docker build-args 我已经尝试了两种方法:
RUN CONFIG=$(echo $CONFIG | sed 's/PWD/'$db_pwd'/g')
第一种方法无法替换,因此$ {USER}为$ {USER}。第二种方法似乎有效(至少在终端中),但似乎变量赋值不起作用。
你知道我怎么能做这个工作吗?随意建议其他方法。我只是不想在我的Dockerfile中使用硬编码参数。
谢谢!
答案 0 :(得分:3)
变量扩展只能在双引号字符串中使用。这是有效的:
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