将Kamal应用迁移至新目标名称的技术咨询
解决方案
要将旧的默认Kamal应用关联到新的production目标,实现无停机部署并自动切换流量,按以下步骤操作:
1. 对齐配置中的服务名称
确保deploy.production.yml里的service字段和原deploy.yml完全一致。Kamal通过服务名称识别同一应用集群,不一致会被当作独立应用处理。
例如原deploy.yml配置:
service: my-rails-app # 其他配置...
deploy.production.yml必须保持相同的service值:
service: my-rails-app # 其他production专属配置...
2. 给旧容器添加Production目标标签
Kamal通过容器的kamal.target标签区分不同环境目标。原默认应用的容器标签为kamal.target=default,需要修改为kamal.target=production,让Kamal将其纳入production目标集群。
在所有生产服务器上执行以下命令(替换<your-service-name>为实际服务名):
# 筛选出默认目标的应用容器,添加production标签 docker ps -q --filter "label=kamal.target=default" --filter "label=com.docker.compose.service=<your-service-name>" | xargs docker container update --label-add kamal.target=production
3. 验证关联结果
执行命令检查是否能识别到旧容器:
kamal details -d production
如果输出中能看到原生产环境的容器信息,说明关联成功。
4. 执行无停机部署
直接运行production目标的部署命令:
kamal deploy -d production
Kamal会按以下流程完成无停机更新:
- 启动新的production应用容器
- 等待新容器通过健康检查
- 自动更新kamal-proxy的路由配置,将流量切换到新容器
- 停止旧容器,释放资源
整个过程不会出现端口冲突,因为proxy负责流量转发,容器内部端口不直接暴露给主机,新旧容器的启动/停止由Kamal有序管控。
内容的提问来源于stack exchange,提问作者Wesley Botham
相关产品推荐
相关产品推荐

