部署部署原理

构建

Zeabur 使用 zbpack 作为内部工具来构建用户服务,使用户无需了解复杂的细节,即可一键部署基于任何语言和框架的服务。

目前,zbpack 已支持所有主流的 Web 开发编程语言,并针对各种流行的开发框架进行了进一步的识别和优化。同时,它也在不断更新以支持新的编程语言和框架:

  • Node.js
  • Python
  • PHP
  • Ruby
  • Go
  • Java
  • .NET
  • Rust
  • Elixir

如果您的服务使用的语言或框架不在上述列表中,或者您发现 zbpack 在构建过程中存在问题,请向 GitHub 提交 Pull Request 来帮助我们改进 zbpack 的功能。

当您使用 zbpack 构建项目中的服务时,它会根据项目中的代码、配置文件等信息自动识别服务使用的语言和框架,并根据这些信息选择合适的方式来构建服务。

生成构建计划

例如,假设您开发了一个基于 Next.js 的 Web 应用程序:

git clone https://github.com/zeabur/nextjs-template
cd nextjs-template

在这个项目的文件夹中运行 zbpack 命令,可以看到为此定制的构建计划:

zbpack .
 
╔══════════════════════════════ Build Plan ═════════════════════════════╗
 provider nodejs
║───────────────────────────────────────────────────────────────────────║
 nodeVersion 18
║───────────────────────────────────────────────────────────────────────║
 installCmd pnpm install
║───────────────────────────────────────────────────────────────────────║
 buildCmd pnpm run build
║───────────────────────────────────────────────────────────────────────║
 startCmd pnpm start
║───────────────────────────────────────────────────────────────────────║
 packageManager pnpm
║───────────────────────────────────────────────────────────────────────║
 framework next.js
╚═══════════════════════════════════════════════════════════════════════╝

从图中可以看出,zbpack 选择使用 nodejs Provider 作为构建的解决方案提供者,这意味着它将在进一步的计划中执行以下操作:

  1. 找出服务使用的 Node.js 版本
  2. 找出服务使用的包管理器(npmyarn 还是 pnpm
  3. 找出服务安装依赖使用的命令
  4. 找出服务构建使用的命令
  5. 找出服务启动使用的命令
  6. 找出服务使用的 Node.js 框架

构建服务

接下来,zbpack 将根据此构建计划生成 Dockerfile,然后自动使用此 Dockerfile 构建服务:

[+] Building 41.3s (12/12) FINISHED                                                                     docker:orbstack
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 252B                                                                               0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/node:18                                                         5.8s
 => [auth] library/node:pull token for registry-1.docker.io                                                        0.0s
 => [1/6] FROM docker.io/library/node:18@sha256:a6385a6bb2fdcb7c48fc871e35e32af8daaa82c518900be49b76d10c005864c2   6.9s
 => [internal] load build context                                                                                  5.0s
 => => transferring context: 171.44MB                                                                              5.0s
 => [2/6] WORKDIR /src                                                                                             0.8s
 => [3/6] RUN corepack enable && corepack prepare --all                                                            7.5s
 => [4/6] COPY . .                                                                                                 2.4s
 => [5/6] RUN pnpm install                                                                                         7.0s
 => [6/6] RUN pnpm run build                                                                                       8.6s
 => exporting to image                                                                                             2.3s
 => => exporting layers                                                                                            2.3s
 => => writing image sha256:d95f934faaefd82b38167ff158e8a31973edcd6a9ba7cc361999080345e80e38                       0.0s
 => => naming to docker.io/library/nextjs-template                                                                 0.0s
 
Build successful
 
To run the image, use the following command:
docker run -p 8080:8080 -it nextjs-template

然后,我们可以使用 docker run -p 8080:8080 -it nextjs-template 启动服务,然后在浏览器中打开 http://localhost:8080 访问服务。