gpt4 book ai didi

bash - Dockerfile:如何用 build-arg 替换环境变量中的占位符?

转载 作者:行者123 更新时间:2023-11-29 09:50:56 29 4
gpt4 key购买 nike

我有一个 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。
我已经尝试了两种方法:

  1. 直接引用变量(见“${USER}”行)
  2. 用以下命令替换“PWD”等占位符 RUN CONFIG=$(echo $CONFIG | sed 's/PWD/'$db_pwd'/g')

第一种方法没有替代品,所以 ${USER} 是 ${USER}。第二种方法似乎可行(至少在终端中),但似乎变量赋值不起作用。

您知道我如何才能完成这项工作吗?随意建议其他方法。我只是不想在我的 Dockerfile 中使用硬编码参数。

谢谢!

最佳答案

变量扩展只能在双引号字符串中起作用。这是有效的:

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

关于bash - Dockerfile:如何用 build-arg 替换环境变量中的占位符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44781979/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com