如何在docker-compose中写入variables,运行多个使用相同映像但其端口不同的容器

我想用docker-compose来维护容器,有一个API服务器集群。

他们从相同的图像构build,我知道docker-compose scale app=5将启动5个容器,但他们都一样,包括端口设置。

我想运行这样的多个容器:

 services: # wx_service_cluster wx_service_51011: build: context: . dockerfile: Dockerfile volumes: - .:/go/src/wx_service ports: - "51011:8080" wx_service_51012: build: context: . dockerfile: Dockerfile volumes: - .:/go/src/wx_service ports: - "51012:8080" wx_service_...: .... THERE ARE ALMOST 100 SERVICES NEED TO BE WROTE ANYONE CAN HELPS ME TO MAKE IT SIMPLER. 

我可以简化一下吗?

像一个shell循环:

 for each_port in $( seq 51011 51040 ) { wx_service_${each_port}: build: context: . dockerfile: Dockerfile volumes: - .:/go/src/wx_service ports: - "${each_port}:8080" } 

简单的回答你的实际问题:使用ENVvariables,可能与dotenv结合https://docs.docker.com/compose/environment-variables/

 services: foo_{$instance1} ports: - "${instance1}:8080" foo_{$instance12} ports: - "${instance2}:8080" 

但是这不会帮助你“为WX生成X服务条目的docker-compose文件”..你似乎计划某种“托pipe”。

备择scheme:

你应该退后一步,而是使用随机端口分配和使用docker检查find端口 – 看到一个例子在这里https://github.com/EugenMayer/docker-sync/blob/master/lib/docker-sync/ sync_strategy / unison.rb#L199 ..所以基本上你要么使用模板系统来生成你docker-compose.yml文件 – 例如像https://github.com/markround/tiller ..然后你生成服务的静态前缀像wx_service_ ..然后你使用一个不同的脚本(为你nginx / haproxy)来configuration和上游的每一个,dynamic地find名称和端口(使用检查)。

如果我是对的,你真的去做某种托pipe场景,而你做商业 – 你甚至可能会重新考虑这一点,并将领事添加到游戏中。 让每个wx服务在consul中作为服务注册,然后使用像nginx / haproxy这样的额外的httpd乘客来重新configuration自己,并在分散器中使用tiller + consul watch添加一个后端+前端/上游+服务器条目。

最后一个只是下一个级别的东西,但如果你这样做“商业”,你不应该做你最初要求的 – 不过,如果你select,使用上面概述的dotenv