【发布时间】:2016-02-02 08:47:56
【问题描述】:
想象一个不平凡的docker compose 应用程序,在 web 应用程序前面有 nginx,以及一些链接的数据存储:
web:
build: my-django-app
volumes:
- .:/code
ports:
- "8000:8000"
links:
- redis
- mysql
- mongodb
nginx:
image: nginx
links:
- web
redis:
image: redis
expose:
- "6379"
mysql:
image: mysql
volumes:
- /var/lib/mysql
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_DATABASE=myproject
mongodb:
image: mongo
数据库很容易配置(目前),容器公开了非常好的环境变量来控制它们(参见mysql 容器),但是nginx 呢?我们需要为此模板化一个 vhost 文件,对吧?
我不想推出自己的图像,这需要为每个更改的配置重新构建,从不同的 devs 设置到 test,通过 登台和制作。如果我们想以轻量级的方式通过翻转配置选项来进行 A/B 测试,该怎么办?
这里需要一些集中配置管理,也许是由 docker-compose 控制的可以将配置文件写入共享卷的东西?
随着新服务的添加,这一点只会变得更加重要(想象一下微服务云,而不是本例中的单体网络应用)
在 docker-compose 项目中管理配置的正确方法是什么?
【问题讨论】:
-
我很想在 envs 中保留配置(这里的基本原理12factor.net/config),但是您无法使用简单的键/值轻松配置哪些服务,例如上面的 nginx 示例?
-
最简单的解决方案就是编写一个入口点脚本,用环境变量中的值填充 nginx 配置文件,然后启动 nginx。这能回答你的问题吗?
-
谢谢阿德里安,这确实适用于 nginx,但是下一个和下一个呢,似乎很奇怪,没有现有的解决方案(etcd,confd?)模式
-
或者,您是说,根据您的经验,一个小小的 entrypoint.sh 是否足以引导每个容器?
-
我在回答中扩展了我的评论。我认为这在绝大多数情况下就足够了,而且肯定是一种常见的模式。
标签: database docker config docker-compose microservices