使用Docker Compose将JSON文件读入环境变量

时间:2016-04-17 19:03:42

标签: json docker docker-compose dockerfile

我已经使用Meteord将Meteor-app对接,并且工作正常,我的问题是我想将一些设置传递给应用。

Meteord不会使用设置文件启动应用程序,因为通常会对应用程序(meteor --settings file.json)进行设置。这也可以with an environement variable 调用METEOR_SETTINGS

由于我希望webapp能够与其他服务一起运行,我使用的是Docker Compose。

我有settings.json - 我希望作为环境变量读取的文件,如下所示:

  environment:
   - METEOR_SETTINGS=$cat(settings.json)

但这并不起作用。

如何让Docker根据JSON文件动态创建此环境变量?

2 个答案:

答案 0 :(得分:2)

根据settings.json中可调整变量的数量,不可能没有一些技巧:

如果有很多设置,使用一个简单的shell脚本模板docker-compose.yml相当容易,该脚本用settings.json的内容替换模板中的令牌,就像你的例子一样。在这种情况下,您还希望包装docker-compose调用。简化示例:

搬运工-compose.yml.template

environment:
 - METEOR_SETTINGS=##_METEOR_SETTINGS_##

dc.sh

#!/bin/sh
# replace ##_METEOR_SETTINGS_## with contents of settings.json and output to docker-compose.yml
sed -e 's|##_METEOR_SETTINGS_##|'"$(cat ./settings.json)"'|' \
    "./docker-compose.yml.template" > "./docker-compose.yml"
# wrap docker-compose, passing all arguments
docker-compose "$@"

将2个文件放入项目根目录,然后chmod +x dc.sh以使包装器可执行并调用./dc.sh -h

如果它只是一些设置,你可以在容器启动时处理容器内的 模板。在启动Meteor之前,简单地替换放置在准备好的settings.json中的令牌,并将ENV值传递给docker。这允许您只使用docker-compose ENV功能来配置Meteor。

答案 1 :(得分:1)

一种简单的方法是将JSON文件加载到本地环境变量中,然后在yaml文件中使用。

在docker-compose.yml

environment:
  METEOR_SETTINGS: ${METEOR_SETTINGS}

在调用docker-compose之前加载设置文件:

❯ METEOR_SETTINGS=$(cat settings.json) docker-compose up