SpringVortexNotes

部署脚本从 Compose 解析服务清单

zjc 于 2026-08-25 发布

代码环境

微服务部署脚本最怕“清单漂移”:Compose 里新增了服务,脚本里却还维护着四个硬编码模块名。这次 Windows 侧 deploy.ps1 的做法是把 docker-compose.yml 当作唯一服务清单。

脚本先解析 Compose 中的镜像定义:

$modules = @(
    Get-Content -LiteralPath "deploy\docker-compose.yml" |
        ForEach-Object {
            if ($_ -match 'image:\s*zjc/service-(?<module>[a-z0-9-]+):') {
                $Matches["module"]
            }
        }
)

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/scripts/windows/deploy.ps1

后面所有循环都基于 $modules

foreach ($module in $modules) {
    $requiredFiles += "deploy\config\$module\application.yaml.template"
    $requiredFiles += "service-$module\target\jib-image.tar"
}

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/scripts/windows/deploy.ps1

也就是说,新增一个 service-ai 时,只要 Compose 里有 zjc/service-ai:tag,脚本就会自动检查它的配置模板和镜像 tar,并按同样规则传输,不需要再改部署脚本的模块数组。

脚本把动作拆成三个开关:

[switch]$Build,
[switch]$Load,
[switch]$Start

Build 调 Maven 构建 linux/amd64 镜像 tar;Load 在远程执行 docker loadStart 加载镜像后执行 docker compose up -dStart 包含加载动作,避免“只想启动却拿到未加载的旧镜像”。

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/scripts/windows/deploy.ps1

传输前还有完整性检查:Compose、.env.example、部署文档、维护脚本、每个模块的模板和 tar 缺一不可。这个检查发生在任何 ssh/scp 动作之前,避免远程目录传到一半才发现本地产物缺失。

完整脚本较长,正文不贴全文,最新源码直接看 GitHub:deploy.ps1

Windows 脚本怎么用

在仓库根目录执行。默认目标是 zjc@192.168.100.128,部署目录是 /home/zjc/app,默认 tag 是 1.0.0

# 只传输已经存在的镜像 tar 和部署文件,不重新构建
.\deploy\scripts\windows\deploy.ps1

# 构建、传输
.\deploy\scripts\windows\deploy.ps1 -Build

# 构建、传输,并在远程执行 docker load
.\deploy\scripts\windows\deploy.ps1 -Build -Load

# 构建、传输、远程加载镜像,并执行 docker compose up -d
.\deploy\scripts\windows\deploy.ps1 -Build -Start

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/scripts/README.md

自定义目标和版本:

.\deploy\scripts\windows\deploy.ps1 `
  -Remote "zjc@192.168.100.128" `
  -AppDir "/home/zjc/app" `
  -Tag "1.0.1" `
  -Build -Start

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/scripts/README.md

如果 PowerShell 执行策略拦截脚本:

powershell -NoProfile -ExecutionPolicy Bypass -File `
  .\deploy\scripts\windows\deploy.ps1 -Build

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/scripts/README.md

Maven 不在 PATH,或者安装路径里有空格时,用 -MavenCommand 指定完整命令:

.\deploy\scripts\windows\deploy.ps1 `
  -Build `
  -MavenCommand "D:\tools\maven\bin\mvn.cmd"

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/scripts/README.md

脚本传输后,Ubuntu 上的关键文件是:

/home/zjc/app/docker-compose.yml
/home/zjc/app/.env.example
/home/zjc/app/config/<module>/application.yaml.template
/home/zjc/app/scripts/unix/manage.sh
/home/zjc/app/images/service-<module>.tar

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/scripts/README.md

首次使用 -Start 前,先把 .env 和每个模块的 config/<module>/application.yaml 准备好;脚本只会传模板,不会生成运行配置。

经验总结

让部署脚本的模块清单来自 Compose,而不是重复维护一份。脚本负责流程编排,服务拓扑仍由 Compose 声明,两边就不会各自为政。

评论

评论由 GitHub Discussions 承载,需要 GitHub 账号登录。