【问题标题】:Passing a JSON file as environment variable in Docker在 Docker 中将 JSON 文件作为环境变量传递
【发布时间】:2017-07-15 14:28:35
【问题描述】:

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


    【解决方案1】:

    更新答案

    您提到您在 systemd 单元文件中使用了docker run 命令。 systemd 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 环境变量将具有值 {docker run 将假定 "conf" 是下一个参数(在这种情况下,图像名称)。

    解决方案:引用您的 bash 变量:

    --env "TEMP_CONFIG=$(cat /etc/config.json)"
    

    另外,不要在不必要的时候使用cat

    --env "TEMP_CONFIG=$(</etc/config.json)"
    

    【讨论】:

    • 不幸的是它不起作用,我得到了和以前一样的错误。顺便说一句,调用在 systemd 服务文件中。
    • systemd 部分很重要!我会更新我的答案,但我也建议您在问题中包含此信息。
    • 非常感谢更新的答案,我在我的系统服务文件中使用ExecStart=/bin/bash -c,我还尝试使用"TEMP_CONFIG=$(&lt;/etc/config.json)"作为参数调用docker run,仍然是容器内的环境变量TEMP_CONFIG是空的。只是出于好奇,在您更新的答案中,开头和结尾都有反斜杠:\"TEMP_CONFIG=$(&lt;/etc/config.json)\" 它们是什么意思?
    • 由于 JSON 对值使用双引号,因此将整个内容用单引号括起来以用于 shell。
    • Base64 在 Docker 外部对 JSON 有效负载进行编码,将外壳安全的 Base64 字符串作为环境变量传入,并在 Docker 内部对消息进行一次解码。
    猜你喜欢
    • 2018-12-02
    • 2020-04-11
    • 2018-09-18
    • 1970-01-01
    • 2020-11-07
    • 2021-11-06
    • 2020-12-09
    • 2023-01-20
    • 2019-06-02
    相关资源
    最近更新 更多