我想在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"
}
}
}
绝对赞赏任何帮助。
答案 0 :(得分:6)
您提到在systemd单元文件中使用docker run
命令。系统ExecStart
选项未在shell中启动。名称支持环境变量替换。另请参阅the documentation:
支持基本环境变量替换。在命令行中使用“
${FOO}
”作为单词的一部分,或作为单词的一部分,在这种情况下,它将被环境变量的值(包括它包含的所有空格)替换,从而产生单一论点。
该文档还说StartExec
不在shell中执行:
此语法旨在与shell语法非常相似,但只能理解以下段落中描述的元字符和扩展。具体来说,使用“<”,“<<”,“>”和“>>”重定向,管道使用“|”,在后台使用“&”运行程序,以及其他元素不支持shell语法。 [...]请注意,不直接支持shell命令行。
但是,您可以使用ExecStart
启动 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
environmant变量的值为{
,docker run
将假定"conf"
为下一个参数(在本例中为图像)名称)。
解决方案:引用您的bash变量:
--env "TEMP_CONFIG=$(cat /etc/config.json)"
此外,如果您不需要,请不要使用cat
:
--env "TEMP_CONFIG=$(</etc/config.json)"