菜单

Docker 配置

相关源文件

本文档涵盖了 Gumroad 平台中使用的 Docker 容器化配置,包括镜像构建过程、标签策略和注册表管理。本文专门关注 Docker 容器设置和构建自动化。有关更广泛的基础设施编排,请参阅Nomad 编排。有关特定于环境的配置,请参阅环境变量

Docker 镜像架构

Gumroad 平台采用多阶段 Docker 架构,通过 CI/CD 流水线构建三种主要镜像类型

Docker 镜像构建层次结构

web_base 镜像作为包含通用依赖的中间层,而 webweb_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 应用程序镜像构建过程

Web 应用程序构建过程同时创建主应用程序容器及其关联的 Nginx 反向代理

Web 镜像构建流水线

Web 镜像构建过程包括秘密复制、基于修订的 Web 镜像标签,以及使用 generate_nginx_tag 函数基于内容的 Nginx 镜像标签。

来源:.buildkite/scripts/build_web.sh21-30 .buildkite/scripts/build_web.sh47-59

镜像标签策略

系统对不同镜像类型采用不同的标签策略

镜像类型标签方法实现
web_base内容 SHAgenerate_tag_for_web_base.sh
webGit 提交echo $REVISION | cut -c1-12
web_nginx内容 SHAgenerate_nginx_tag "public" "docker/nginx"

generate_nginx_tag 函数根据影响特定路径的最新提交创建标签。

Nginx 标签过程

来源:.buildkite/scripts/build_web.sh47-66 .buildkite/scripts/build_web.sh18-19

Docker 忽略配置

.dockerignore 文件将开发和构建产物从 Docker 上下文中排除

类别排除项目的
依赖项.bundle, vendor/cache/, vendor/bundle/排除缓存的 gem
开发.DS_Store, .git, ci_scripts/排除 VCS 和开发工具
运行时tmp/, log/, docker/tmp/排除临时文件
环境.env, .env.*.local排除本地配置

此配置通过在 Docker 构建期间排除非必要文件,确保最小的镜像大小。

来源:.dockerignore1-13

注册表管理和重试逻辑

所有镜像推送操作都实现了带有指数退避的强大重试机制

推送重试策略

系统最多尝试 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