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

时间:2017-02-24 16:47:49

标签: json docker environment-variables

我想在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"
        }
    }
}

绝对赞赏任何帮助。

1 个答案:

答案 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)"