如何在docker-compose中编写变量,运行多个使用相同图像但其端口不同的容器

时间:2017-06-25 08:33:18

标签: docker docker-compose

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

他们使用相同的图像构建,我知道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"
}

1 个答案:

答案 0 :(得分:1)

简单回答您的实际问题:使用ENV变量并可能将其与dotenv https://docs.docker.com/compose/environment-variables/

结合使用
services:
  foo_{$instance1}
    ports:
      - "${instance1}:8080"
  foo_{$instance12}
    ports:
      - "${instance2}:8080"

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

备选方案:

你应该退一步,而不是使用随机端口分配和使用docker inspect来查找端口 - 请参阅这里的示例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)配置和上游每个,找到名称和端口(使用动态检查。

如果我是对的,你真的会采用某种托管方案而且你是商业化的 - 你甚至可能会重新考虑这个并为游戏添加领事。让每个wx服务在领事中注册为服务,然后使用额外的httpd乘客(如nginx / haproxy)重新配置自身,并使用tiller + consul watch在passender中添加后端+前端/上游+服务器条目。

最后一个只是下一个级别的东西,但如果你“商业化”这样做,你不应该做你最初要求的 - 然而,如果你选择,使用如上所述的dotenv