我想在 docker 运行期间将 JSON 文件的内容作为环境变量传递。 docker run 在 systemd 服务文件中初始化。
我做了类似的事情:
export TEMP_CONFIG=$(cat /etc/config.json)
并按如下方式运行 docker 容器:
docker run \
--env SERVICE_NAME=${CONTAINER_NAME} \
--env TEMP_CONFIG \
但是当我在 docker 容器内并尝试回显变量 ${TEMP_CONFIG} 时,它是空的。
root@ip-10-109-7-77:/usr/local/nginx/conf# echo ${TEMP_CONFIG}
root@ip-10-109-7-77:/usr/local/nginx/conf#
有没有办法将 JSON 文件的内容作为环境变量传递?
顺便说一句:
--env TEMP_CONFIG=$(cat /etc/config.json) \
执行上述操作会引发异常:
docker: Error parsing reference: "\"conf\"" is not a valid repository/tag.
config.json的内容为:
{
"conf" :
{
"appname" :
{
"dbhost" : "xxxx",
"dbname" : "dbname",
"dbuser" : "user",
"dbpassword" : "xxxxx",
"hostname" : "xxxxxx"
},
"cacheBaseDir" : "/storage/",
"iccprofile" : "/etc/nginx/RGB.V1.0.icc",
"tmpDir" : "/tmp",
"mdb" :
{
"user" : "user",
"password" : "xxxxx",
"rights" : "GlobalAdministrator",
"company" : "somecompany"
}
}
}
任何帮助都非常感激。
您提到您在 systemd 单元文件中使用
docker run
命令。 systemd ExecStart
选项不在 shell 中启动。通过名称支持环境变量替换。另请参阅文档:
支持基本环境变量替换。在命令行上使用“
”作为单词的一部分,或作为其自己的单词,在这种情况下,它将被环境变量的值(包括它包含的所有空格)替换,从而产生单个参数.${FOO}
文档还说
StartExec
不在 shell 中执行:
此语法旨在与 shell 语法非常相似,但只能理解以下段落中描述的元字符和扩展。具体来说,不支持使用“<", "<<", ">”和“>>”的重定向、使用“|”的管道、使用“&”在后台运行程序以及 shell 语法的其他元素。 [...] 请注意,不直接支持 shell 命令行。
但是,您可以使用
ExecStart
来 start shell,然后使用 -c
标志传递命令(您仍然需要引用下面我的原始答案中提到的变量):
ExecStart=/bin/bash -c "docker run -e \"TEMP_CONFIG=$(</etc/config.json)\" ..."
您的 JSON 字符串包含空格,如果不加引号,您的 shell 会将第一个空格之后的所有内容解释为后续参数。所以
TEMP_CONFIG=$(cat /etc/config.json)
本质上等同于:
--env TEMP_CONFIG={ "conf" : { "...
在这种情况下,
TEMP_CONFIG
环境变量的值为{
,并且docker run
将假定"conf"
为下一个参数(在本例中为图像名称)。
解决方案:引用你的 bash 变量:
--env "TEMP_CONFIG=$(cat /etc/config.json)"
另外,当你不需要时,不要使用
cat
:
--env "TEMP_CONFIG=$(</etc/config.json)"
如果你想在 Windows 上执行此操作,这对我有用: 您仍然需要引用下面提到的变量。 请参阅此处的示例