使用Docker构建缓存实现高效构建

本文探讨如何使用 Docker 注册表在团队之间存储和共享 Docker 构建缓存。

在现代软件开发中,Docker 已成为构建、发布和运行应用程序的基石。开发人员面临的主要挑战之一是优化构建时间,尤其是对于大型复杂应用程序而言。

Docker 构建缓存为这个问题提供了一个强大的解决方案,它允许您重用以前构建的层,从而显著加快了构建过程。

本文探讨如何为不同阶段(例如构建器阶段)创建和存储构建缓存,以及如何使用 Docker Registry 与您的团队共享此缓存。

什么是Docker 构建缓存
Docker 构建缓存是一种允许 Docker 重用先前构建的层的机制。Dockerfile 中的每条指令都会创建一个新层,Docker 会缓存这些层以避免重复工作。重建映像时,Docker 会检查是否可以重用任何缓存的层,这可以大大缩短构建时间。

多阶段构建和缓存
多阶段构建是 Docker 中的一项强大功能,可让您在 Dockerfile 中使用多个 FROM 语句。这使您能够创建中间阶段(例如构建器阶段),这些阶段可以缓存并独立重复使用。通过缓存这些阶段,您可以进一步优化构建过程。

设置Docker构建缓存
步骤 1:创建多阶段 Dockerfile
首先,创建一个包含多个阶段的 Dockerfile。以下是示例:

# Stage 1: Builder
FROM node:14 AS builder
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run build

# Stage 2: Production
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html

第 2 步:一些设置
在本地,您可能必须使用containerd才能使用缓存功能。

在Docker Desktop的设置中,在“常规”选项卡中,您必须启用“使用 containerd 来提取和存储图像Use containerd for pulling and storing images.”。


我还建议您添加这个环境变量:DOCKER_BUILDKIT=1

步骤 3:构建第一阶段并推送缓存
要构建映像并将缓存推送到 Docker Registry,请使用以下命令:

docker build --target builder \
  --cache-to=type=registry,ref=myregistry.com/myapp:cache-builder \
  -t myapp:builder-latest .

因此,您构建了但并未推送,但仍有一些内容写入了我们的注册表。缓存层已写入您的注册表。

我们可以稍微调整一下我们的缓存选项,以压缩更多的层,从而减少存储占用的空间:compression=zstd,mode=max

docker build --target builder \
  --cache-to=type=registry,ref=myregistry.com/myapp:cache-builder,compression=zstd,mode=max \
  -t myapp:builder-latest .

步骤 4:使用构建器的缓存构建第二阶段

docker build --cache-from=type=registry,ref=myregistry.com/myapp:cache-builder -t myapp:latest .

# Push the final image
docker push myregistry.com/myapp:latest

您还可以将—cache-from和—cache-to与 Github Actions 结合使用: build-push-action

步骤 5:更新你的 docker-compose
如果您的团队使用 docker-compose,为了让他们从此缓存中受益,您只需在构建中添加:

version: '3.5'

services:
    myapp:
        build:
            context: .
            args:
                - DOCKER_BUILDKIT=1
            cache_from:
                - type=registry,ref=myregistry.com/myapp:cache-builder
...

跨团队共享构建缓存
通过将构建缓存存储在 Docker Registry 中,您可以轻松地与团队共享它。这可确保每个人都能从缓存层中受益,从而缩短构建时间并提高生产力。

使用 Docker Build Cache 的最佳实践

  • 使用多阶段构建:将 Dockerfile 分解为多个阶段以优化缓存。
  • 最小化层变化:将频繁变化的指令组合在一起,以最大限度地减少缓存失效。
  • 使用 .dockerignore :从构建上下文中排除不必要的文件以加快构建过程。
  • 定期更新缓存:定期重建和推送缓存,以确保其与最新更改保持同步。

结论
利用 Docker 构建缓存可以显著改善您的开发工作流程,缩短构建时间并提高流程效率。通过在 Docker Registry 中存储和共享缓存,您可以确保所有团队成员都能从这些优化中受益。实施这些实践将加快构建速度、提高生产力并提供更流畅的开发体验。