如何在运行dockercompose时替换yml文件中的环境变量



我想将env变量传递到一个yml文件,该文件将用作某个容器的配置文件。

这是我的文件树。

alertmanager
- .env
- alertmanager.yml
prometheus
- prometheus.yml
- rules.yml
docker-compose.yml

这是一个docker compose文件中的代码。


alertmanager:
image: prom/alertmanager
container_name: alertmanager
ports:
- 9093:9093
volumes:
- ./alertmanager/:/etc/alertmanager/
restart: always
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
- '--storage.path=/alertmanager'
env_file:
- ./alertmanager/.env

下面是alaertmanager.yml。

route:
receiver: "slack"
receivers:
- name: "slack"
slack_configs:
- send_resolved: true
username: ${USERNAME}
channel: ${CHANNEL}
api_url: ${SLACK_URL}

问题是alertmanager.yml将${SLACK_URL}识别为字符串。我想这是因为alertmanage.yml是一个静态文件,没有引擎可以将${SLACK_URL}替换为类似http://slack_url.com的文件。

我看到了一些解决这个问题的答案。第一个选项是创建一个python脚本,它可以将${}替换为env变量。然而,据我所知,我需要在docker图像中包含python。另一种选择是使用envsubst。但是,我需要再次在docker映像中启用envsubst命令。在这两种方式中,我都需要自定义一个docker图像,我认为这很麻烦。

有解决这个问题的办法吗
如有任何帮助,我们将不胜感激。

在yml文件上测试这个。它正在开发我的ruby on rails

slack_url: <%= ENV['SLACK_URL'] %> 

compose.yml

environment:
SLACK_URL: some_url

在不更改docker文件的情况下运行envsubst的一个解决方案是通过compose文件修改容器的入口点。为此,您需要检查您正在使用的图像的原始入口点。

entrypoint: "envsubst < "source.txt" | sponge "source.txt" && <entrypoint of image>"

这假设envsubstsponge已安装在映像中。如果没有,您可以编写一个执行相同工作的脚本,装载它并通过相同的技术运行,或者添加安装命令的说明。这也可以在脚本中完成。

最新更新