Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Docker中将JSON文件作为环境变量传递_Json_Docker_Environment Variables - Fatal编程技术网

在Docker中将JSON文件作为环境变量传递

在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

我希望在docker运行期间将JSON文件的内容作为环境变量传递。docker运行在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文件的内容作为环境变量传递

顺便说一句:

执行上述操作会引发异常:

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
启动一个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)"