使用 Docker Compose 将 JSON 文件读入环境变量
Read JSON-file into environment variable with Docker Compose
我已经使用 Meteord 对一个 Meteor 应用程序进行了 docker 化,并且工作正常,我的问题是我想将一些设置传递给该应用程序。
Meteord 不会像通常为应用程序提供设置那样使用设置文件启动应用程序 (meteor --settings file.json
)。这也可以做到with an environement variable 叫METEOR_SETTINGS
。
因为我希望 webapp 运行 与其他服务一起使用,所以我正在使用 Docker Compose。
我有我的 settings.json
文件,我想将其作为环境变量读入,例如:
environment:
- METEOR_SETTINGS=$cat(settings.json)
虽然这不起作用。
如何让 Docker compose 根据 JSON 文件动态创建此环境变量?
没有一些技巧是不可能的,这取决于 settings.json
中可调整变量的数量:
如果有很多设置,用一个简单的 shell 脚本来模板化 docker-compose.yml
是相当容易的,该脚本用 settings.json
的内容替换模板中的标记,就像在你的例子中。在这种情况下,您还想包装 docker-compose 调用。简化示例:
docker-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
中的令牌替换为传递给 docker 的 ENV 值。这允许您只使用 docker-compose ENV 功能来配置 Meteor。
一个简单的方法是将 JSON 文件加载到本地环境变量中,然后在您的 yaml 文件中使用它。
在docker-compose.yml
environment:
METEOR_SETTINGS: ${METEOR_SETTINGS}
在调用 docker-compose:
之前加载设置文件
❯ METEOR_SETTINGS=$(cat settings.json) docker-compose up
我已经使用 Meteord 对一个 Meteor 应用程序进行了 docker 化,并且工作正常,我的问题是我想将一些设置传递给该应用程序。
Meteord 不会像通常为应用程序提供设置那样使用设置文件启动应用程序 (meteor --settings file.json
)。这也可以做到with an environement variable 叫METEOR_SETTINGS
。
因为我希望 webapp 运行 与其他服务一起使用,所以我正在使用 Docker Compose。
我有我的 settings.json
文件,我想将其作为环境变量读入,例如:
environment:
- METEOR_SETTINGS=$cat(settings.json)
虽然这不起作用。
如何让 Docker compose 根据 JSON 文件动态创建此环境变量?
没有一些技巧是不可能的,这取决于 settings.json
中可调整变量的数量:
如果有很多设置,用一个简单的 shell 脚本来模板化 docker-compose.yml
是相当容易的,该脚本用 settings.json
的内容替换模板中的标记,就像在你的例子中。在这种情况下,您还想包装 docker-compose 调用。简化示例:
docker-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
中的令牌替换为传递给 docker 的 ENV 值。这允许您只使用 docker-compose ENV 功能来配置 Meteor。
一个简单的方法是将 JSON 文件加载到本地环境变量中,然后在您的 yaml 文件中使用它。
在docker-compose.yml
environment:
METEOR_SETTINGS: ${METEOR_SETTINGS}
在调用 docker-compose:
之前加载设置文件❯ METEOR_SETTINGS=$(cat settings.json) docker-compose up