在Docker中传递一个JSON文件作为环境variables

我想在Docker运行期间将JSON文件的内容作为环境variables传递。 docker运行是在一个systemd服务文件内初始化的。

我做了这样的事情:

export TEMP_CONFIG=$(cat /etc/config.json) 

并运行docker集装箱如下:

 docker run \ --env SERVICE_NAME=${CONTAINER_NAME} \ --env TEMP_CONFIG \ 

但是,当我在docker容器内,并尝试回显variables$ {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文件的内容作为环境variables传递?

BTW:

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

以上做法引发exception:

 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中启动。 环境variablesreplace是由名称支持的。 另请参阅此文档 :

支持基本的环境variablesreplace。 在命令行中使用“ ${FOO} ”作为单词的一部分,或作为它自己的一个单词,在这种情况下,它将被环境variables的值replace,包括它所包含的所有空格,导致一个单一的论据。

该文档还说,在一个shell中不执行StartExec

此语法旨在与shell语法非常相似,但只能理解以下段落中描述的元字符和扩展。 具体而言,不支持使用“<”,“<<”,“>”和“>>”进行redirect,使用“|”的pipe道,使用“&”在后台运行程序以及shell语法的其他元素。 […]请注意,shell命令行不直接支持。

但是,可以使用ExecStart 启动一个shell,然后使用-c标志传递一个命令(您仍然需要引用下面我原来的回答中提到的variables):

 ExecStart=/bin/bash -c "docker run -e \"TEMP_CONFIG=$(</etc/config.json)\" ..." 

原始答案

你的JSONstring包含空格,并且不用引用你的shell就会将第一个空格之后的所有内容解释为后续的参数。 所以TEMP_CONFIG=$(cat /etc/config.json)基本上等同于:

 --env TEMP_CONFIG={ "conf" : { "... 

在这种情况下, TEMP_CONFIG environmantvariables将具有值{ ,并且docker run将假定"conf"为下一个参数(在本例中为图像名称)。

解决scheme:引用你的bashvariables:

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

此外,不要使用cat当你不必:

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