如何在Docker Compose中运行my_app多实例并配置不同环境变量?
无需显式声明多个服务创建多实例的方法
你不需要完全复制多个重复的my_app服务配置,有几种更简洁的方式来实现需求:
1. 用docker-compose run动态启动实例
直接通过命令行指定环境变量和容器名,每次启动一个独立的应用实例:
# 启动处理账户1的实例 docker-compose run --name my_app_account1 -e ACCOUNT=1 my_app # 启动处理账户2的实例 docker-compose run --name my_app_account2 -e ACCOUNT=2 my_app
注意:这种方式启动的容器默认没有restart: always策略,如果需要自动重启,可以在启动后用docker update --restart always my_app_account1修改,或者提前在compose文件里给my_app配置好重启策略后再执行run命令。
2. 用Compose扩展字段减少重复配置
如果需要通过compose文件管理所有实例,又不想重复写镜像、链接等相同配置,可以用YAML锚点和扩展字段复用基础配置:
version: '3.7' # 定义基础配置锚点 x-my-app-base: &my-app-base image: my_app/image restart: always links: - mysql services: my_app1: <<: *my-app-base # 复用基础配置 environment: - ACCOUNT=1 - ACCOUNT=2 - ACCOUNT=3 my_app2: <<: *my-app-base environment: - ACCOUNT=4 - ACCOUNT=5 - ACCOUNT=6 my_app3: <<: *my-app-base environment: - ACCOUNT=7 - ACCOUNT=8 - ACCOUNT=9 mysql: image: mysql restart: always
这种方式既保留了compose文件的可维护性,又避免了大量重复代码。
3. 结合环境变量文件启动多实例
准备多个环境变量文件(比如.env.group1、.env.group2),启动时指定不同文件来区分实例:
首先修改compose文件,让容器名和环境变量支持动态替换:
version: '3.7' services: my_app: image: my_app/image restart: always links: - mysql container_name: my_app_${GROUP_NAME} # 动态容器名 environment: - ACCOUNTS=${ACCOUNTS} # 从环境变量文件读取账户列表 mysql: image: mysql restart: always
然后创建.env.group1:
GROUP_NAME=group1 ACCOUNTS=1,2,3
.env.group2:
GROUP_NAME=group2 ACCOUNTS=4,5,6
最后分别启动实例:
docker-compose --env-file .env.group1 up -d --no-deps my_app docker-compose --env-file .env.group2 up -d --no-deps my_app
--no-deps参数可以避免重复启动mysql服务。
内容的提问来源于stack exchange,提问作者bxiong
相关产品推荐
相关产品推荐

