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

问题描述 投票:0回答:2

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

任何帮助都非常感激。

json docker environment-variables
2个回答
15
投票

更新答案

您提到您在 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)"

0
投票

如果你想在 Windows 上执行此操作,这对我有用: 您仍然需要引用下面提到的变量。 请参阅此处的示例

© www.soinside.com 2019 - 2024. All rights reserved.