在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)"