本文档涵盖了 Gumroad 平台中使用的 Docker 容器化配置,包括镜像构建过程、标签策略和注册表管理。本文专门关注 Docker 容器设置和构建自动化。有关更广泛的基础设施编排,请参阅Nomad 编排。有关特定于环境的配置,请参阅环境变量。
Gumroad 平台采用多阶段 Docker 架构,通过 CI/CD 流水线构建三种主要镜像类型
Docker 镜像构建层次结构
web_base 镜像作为包含通用依赖的中间层,而 web 和 web_nginx 镜像则用于构建特定的应用程序组件。
来源:.buildkite/scripts/build_base.sh10-19 .buildkite/scripts/build_web.sh10-12
基础镜像构建过程通过 build_base.sh 进行管理,并使用智能缓存以避免不必要的重建。
基础镜像构建流程
系统使用 generate_tag_for_web_base.sh 生成一个基于 SHA 的标签,并且只有当镜像在注册表中不存在时才进行构建。构建使用 build_base make 目标,并使用 CONTRIBSYS_CREDENTIALS 进行私有 gem 访问。
| 组件 | 仓库路径 | 目的 |
|---|---|---|
WEB_BASE_REPO | ${ECR_REGISTRY}/gumroad/web_base | 基础应用程序依赖 |
| Ruby 基础 | ruby:$(cat .ruby-version)-slim-bullseye | 官方 Ruby 运行时 |
来源:.buildkite/scripts/build_base.sh14-36
Web 应用程序构建过程同时创建主应用程序容器及其关联的 Nginx 反向代理
Web 镜像构建流水线
Web 镜像构建过程包括秘密复制、基于修订的 Web 镜像标签,以及使用 generate_nginx_tag 函数基于内容的 Nginx 镜像标签。
来源:.buildkite/scripts/build_web.sh21-30 .buildkite/scripts/build_web.sh47-59
系统对不同镜像类型采用不同的标签策略
| 镜像类型 | 标签方法 | 实现 |
|---|---|---|
web_base | 内容 SHA | generate_tag_for_web_base.sh |
web | Git 提交 | echo $REVISION | cut -c1-12 |
web_nginx | 内容 SHA | generate_nginx_tag "public" "docker/nginx" |
generate_nginx_tag 函数根据影响特定路径的最新提交创建标签。
Nginx 标签过程
来源:.buildkite/scripts/build_web.sh47-66 .buildkite/scripts/build_web.sh18-19
.dockerignore 文件将开发和构建产物从 Docker 上下文中排除
| 类别 | 排除项 | 目的 |
|---|---|---|
| 依赖项 | .bundle, vendor/cache/, vendor/bundle/ | 排除缓存的 gem |
| 开发 | .DS_Store, .git, ci_scripts/ | 排除 VCS 和开发工具 |
| 运行时 | tmp/, log/, docker/tmp/ | 排除临时文件 |
| 环境 | .env, .env.*.local | 排除本地配置 |
此配置通过在 Docker 构建期间排除非必要文件,确保最小的镜像大小。
所有镜像推送操作都实现了带有指数退避的强大重试机制
推送重试策略
系统最多尝试 3 次推送,每次失败之间延迟 5 秒,即使在网络不稳定下也能确保可靠地交付到 ECR 注册表。
注册表端点
${ECR_REGISTRY}/gumroad/web_base${ECR_REGISTRY}/gumroad/web${ECR_REGISTRY}/gumroad/web_nginx来源:.buildkite/scripts/build_base.sh22-33 .buildkite/scripts/build_web.sh34-45 .buildkite/scripts/build_web.sh69-80