在Docker中将JSON文件作为环境变量传递
我希望在docker运行期间将JSON文件的内容作为环境变量传递。docker运行在systemd服务文件中初始化 我做了这样的事情:在Docker中将JSON文件作为环境变量传递,json,docker,environment-variables,Json,Docker,Environment Variables,我希望在docker运行期间将JSON文件的内容作为环境变量传递。docker运行在systemd服务文件中初始化 我做了这样的事情: export TEMP_CONFIG=$(cat /etc/config.json) 并按如下方式运行docker容器: docker run \ --env SERVICE_NAME=${CONTAINER_NAME} \ --env TEMP_CONFIG \ 但是当我在docker容器中尝试回显变量${TEMP_CONF
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文件的内容作为环境变量传递
顺便说一句:
执行上述操作会引发异常:
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
命令。systemdExecStart
选项不是在shell中启动的。名称支持环境变量替换。另请参见以下内容:
支持基本环境变量替换。在命令行上使用“${FOO}
”作为单词的一部分,或作为单词本身,在这种情况下,它将被环境变量的值替换,包括它包含的所有空格,从而产生一个参数
文档还指出,StartExec
不是在shell中执行的:
该语法与shell语法非常相似,但只理解以下段落中描述的元字符和扩展。具体来说,不支持使用“”的重定向、使用“|”的管道、使用“&”在后台运行程序以及shell语法的其他元素。[…]请注意,不直接支持shell命令行
但是,您可以使用ExecStart
启动一个shell,然后使用-c
标志传递一个命令(您仍然需要引用下面我原始答案中提到的变量):
在本例中,TEMP\u CONFIG
environmant变量的值为{
,而docker run
将假定“conf”
为下一个参数(在本例中为图像名称)
解决方案:引用bash变量:
--env "TEMP_CONFIG=$(cat /etc/config.json)"
另外,在不必执行以下操作时,不要使用cat
:
--env "TEMP_CONFIG=$(</etc/config.json)"
--env“临时配置”=$(不幸的是,它不起作用,我得到了与以前相同的错误。顺便说一句,调用在systemd服务文件中。systemd部分很重要!我将更新我的答案,但我也建议您在问题中包含此信息。非常感谢更新的答案,我在我的系统服务中使用了ExecStart=/bin/bash-c
)ile,我还试着用“TEMP_CONFIG=$”调用docker run(我刚刚尝试了你的解决方案并充当了charm,现在我明白了为什么前面有反斜杠,这是为了避开引号。在之前的评论中,这是一个非常幼稚的问题,对此表示歉意:)我以前试过,没有反斜杠,因为JSON对值使用双引号,所以在shell中用单引号括起来。
--env TEMP_CONFIG={ "conf" : { "...
--env "TEMP_CONFIG=$(cat /etc/config.json)"
--env "TEMP_CONFIG=$(</etc/config.json)"