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

Ess*_*sso 11 json docker dockerfile docker-compose

我已经使用 Meteord 对 Meteor-app 进行了码头化处理,效果很好,我的问题是我想将一些设置传递给该应用程序。

Meteord 不会像通常为应用程序提供设置那样使用设置文件启动应用程序 ( meteor --settings file.json)。这也可以通过名为 的环境变量来实现METEOR_SETTINGS

因为我希望 webapp 与其他服务一起运行,所以我使用 Docker Compose。

我有我settings.json想要作为环境变量读入的 -file,例如:

  environment:
   - METEOR_SETTINGS=$cat(settings.json)
Run Code Online (Sandbox Code Playgroud)

但这不起作用。

如何让 Docker 撰写基于 JSON 文件动态创建此环境变量?

Kev*_*man 6

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

在 docker-compose.yml

environment:
  METEOR_SETTINGS: ${METEOR_SETTINGS}
Run Code Online (Sandbox Code Playgroud)

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

? METEOR_SETTINGS=$(cat settings.json) docker-compose up
Run Code Online (Sandbox Code Playgroud)


Eri*_*erg 5

没有一些技巧是不可能的,具体取决于可调整变量的数量settings.json

如果有很多设置,那么docker-compose.yml使用简单的 shell 脚本对 进行模板化相当容易,该脚本将模板中的标记替换为 的内容settings.json,就像您的示例一样。在这种情况下,您还需要包装 docker-compose 调用。简化示例:

docker-compose.yml.template

environment:
 - METEOR_SETTINGS=##_METEOR_SETTINGS_##
Run Code Online (Sandbox Code Playgroud)

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 "$@"
Run Code Online (Sandbox Code Playgroud)

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

如果只有一些设置,您可以在容器启动时处理容器内的模板。只需在启动 Meteor 之前将准备好的令牌替换settings.json为传递给 docker 的 ENV 值即可。这允许您仅使用 docker-compose ENV 功能来配置 Meteor。