gpt4 book ai didi

docker - 我可以避免为蓝绿部署重复我的服务定义吗?

转载 作者:行者123 更新时间:2023-12-02 20:02:59 24 4
gpt4 key购买 nike

我正在研究一种简单的方法来蓝绿部署应用程序后端。
我从一开始就为后端写了一个 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

最佳答案

结合不同的选择。第一个是您可以创建两个完全独立的堆栈,一个用于蓝色,另一个用于绿色。您需要将任何公共(public)服务移到第三个公共(public)堆栈中,并使用外部网络和/或卷进行连接。在蓝/绿堆栈定义中,使用变量来配置该堆栈独有的任何内容,例如您的端口。这将是我推荐的解决方案,因为它允许您轻松地将更多服务添加到组合中,并使用相同的撰写文件在蓝/绿环境之外部署相同的堆栈。

第二种选择是使用 Yaml 的 anchor 和别名语法。

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

最后一个选项是将服务的公共(public)部分定义为 extension field然后使用相同的别名和 anchor 语法在撰写文件中重用它。
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

关于docker - 我可以避免为蓝绿部署重复我的服务定义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52178651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com