我正在研究一种简单的方法,用于对应用程序后端进行蓝绿色部署。 我从一开始就为后端编写了一个docker-compose文件,后来迁移了compose文件以支持蓝绿色。
我不需要docker swarm或类似的东西。 我使用蓝绿色部署,因为该项目的每个前端版本都必须经过审核过程才能发布,并且不允许在审核后以任何方式进行更改。因此,无论我为前端版本连接的任何后端端点,都将在审查后立即修复。因此,我交替使用每个版本的后端端点,以便随时进行测试和实时后端。
我的问题是:由于服务定义非常重复,是否可以以某种方式简化这些服务定义?本质上,蓝色和绿色服务执行相同的操作。我什至可以为这两个端口使用相同的端口,因为我的反向代理关心路由请求。 但是我无法弄清楚如何用不同的名称(蓝色或绿色)启动两次服务,因此我复制了后端服务。
version: '3'
networks:
nw1:
external: false
nw2:
external: true
services:
blue:
entrypoint:
- npm
- run
command:
- "start-backend"
- --
- -s
- ${CLIENT_SECRET}
- -c
- ${CLIENT_ID}
- -o
- ${OWNER_ID}
build: .
expose:
- ${BLUE_PORT}
networks:
- nw1
- nw2
environment:
- PORT=${BLUE_PORT}
- CONFIG=live
depends_on:
- mongodb
green:
entrypoint:
- npm
- run
command:
- "start-backend"
- --
- -s
- ${CLIENT_SECRET}
- -c
- ${CLIENT_ID}
- -o
- ${OWNER_ID}
build: .
expose:
- ${GREEN_PORT}
networks:
- nw1
- nw2
environment:
- PORT=${GREEN_PORT}
- CONFIG=live
depends_on:
- mongodb
mongodb:
image: mongo:3.4
environment:
- MONGO_DATA_DIR=/data/db
- MONGO_LOG_DIR=/dev/null
volumes:
- ./myapplication/data/db:/data/db
command: mongod --smallfiles --logpath=/dev/null # --quiet
networks:
- nw1
答案 0 :(得分:0)
耦合不同的选项。第一个是您可以创建两个完全独立的堆栈,一个用于蓝色,另一个用于绿色。您需要将其中的所有公共服务移至第三个公共堆栈,并使用外部网络和/或卷进行连接。在蓝色/绿色堆栈定义中,使用变量配置该堆栈唯一的任何内容,例如端口。这将是我推荐的解决方案,因为它使您可以轻松地向混合中添加更多服务,并使用相同的撰写文件将相同的堆栈部署到蓝色/绿色环境之外。
第二个选项是使用Yaml的锚点和别名语法。
version: '3'
networks:
nw1:
external: false
nw2:
external: true
services:
blue: &service
entrypoint:
- npm
- run
command:
- "start-backend"
- --
- -s
- ${CLIENT_SECRET}
- -c
- ${CLIENT_ID}
- -o
- ${OWNER_ID}
build: .
expose:
- ${BLUE_PORT}
networks:
- nw1
- nw2
environment:
- PORT=${BLUE_PORT}
- CONFIG=live
depends_on:
- mongodb
green:
<<: *service
expose:
- ${GREEN_PORT}
environment:
- PORT=${GREEN_PORT}
- CONFIG=live
mongodb:
image: mongo:3.4
environment:
- MONGO_DATA_DIR=/data/db
- MONGO_LOG_DIR=/dev/null
volumes:
- ./myapplication/data/db:/data/db
command: mongod --smallfiles --logpath=/dev/null # --quiet
networks:
- nw1
最后一个选择是将服务的公共部分定义为extension field,然后使用相同的别名和锚点语法在组合文件中重复使用。
version: '3.7'
x-service-common: &service-common
entrypoint:
- npm
- run
command:
- "start-backend"
- --
- -s
- ${CLIENT_SECRET}
- -c
- ${CLIENT_ID}
- -o
- ${OWNER_ID}
build: .
networks:
- nw1
- nw2
depends_on:
- mongodb
networks:
nw1:
external: false
nw2:
external: true
services:
blue:
<<: *service-common
expose:
- ${BLUE_PORT}
environment:
- PORT=${BLUE_PORT}
- CONFIG=live
green:
<<: *service-common
expose:
- ${GREEN_PORT}
environment:
- PORT=${GREEN_PORT}
- CONFIG=live
mongodb:
image: mongo:3.4
environment:
- MONGO_DATA_DIR=/data/db
- MONGO_LOG_DIR=/dev/null
volumes:
- ./myapplication/data/db:/data/db
command: mongod --smallfiles --logpath=/dev/null # --quiet
networks:
- nw1