Docker 缓存

docker:cache

构建一个 Docker 镜像作为缓存,在未来的构建中重复使用。

可以避免网络资源如 依赖包 重复下载。

# 适用事件

所有事件

# 参数

# dockerfile

  • type: String
  • required: true

用于构建缓存镜像的 Dockerfile 路径。

为避免超长时间构建,Docker 镜像构建超时时间受 job.timeout 参数控制。

# by

  • type: Array<String> | String
  • required: false

用来声明缓存镜像构建过程中依赖的文件列表。注意:未出现在 by 列表中的文件,除了 Dockerfile,其他在构建镜像过程中,都当不存在处理。

  • 支持数组格式
  • 支持字符串格式,多个文件用英文逗号分隔。

# versionBy

  • type: Array<String> | String
  • required: false

用来进行版本控制,未传入 versionBy,则默认取 by 的值进行版本控制。

versionBy 所指向的文件内容发生变化,我们就会认为是一个新的版本, 具体的计算逻辑见这个表达式:sha1(Dockerfile + versionBy + buildArgs + target + arch)。

  • 支持数组格式。
  • 支持字符串格式,多个文件用英文逗号分隔。

# buildArgs

  • type: Object
  • required: false

在 build 时插入额外的构建参数 (--build-arg $key=$value), value 值为 null 时只加入 key (--build-arg $key)。

# target

  • type: String
  • required: false

对应 docker build 中的 --target 参数,可以选择性地构建 Dockerfile 中的特定阶段,而不是构建整个 Dockerfile。

# sync

  • type: Boolean
  • required: false
  • default: false

是否同步模式,等待缓存镜像 docker push 成功后才继续。

# ignoreBuildArgsInVersion

  • type: Boolean
  • required: false
  • default: false

版本计算是否忽略 buildArgs

详见版本控制

# 输出结果

{
  // 缓存对应的 docker image name
  name
}

# 配置样例

main:
  push:
    - docker:
        image: node:14
      stages:
        - name: build cache image
          type: docker:cache
          options:
            dockerfile: cache.dockerfile
            # by 支持以下两种形式:数组、字符串
            by:
              - package.json
              - package-lock.json
            # versionBy: package-lock.json
            versionBy:
              - package-lock.json
          exports:
            name: DOCKER_CACHE_IMAGE_NAME
        - name: use cache
          image: $DOCKER_CACHE_IMAGE_NAME
          # 将 cache 中的文件拷贝过来使用
          commands:
            - cp -r "$NODE_PATH" ./node_modules
        - name: build with cache
          script:
            - npm run build

其中,cache.dockerfile 是一个用于构建缓存镜像的 Dockerfile。示例:

# 选择一个 Base 镜像
FROM node:14

# 设置工作目录
WORKDIR /space

# 将 by 中的文件列表 COPY 过来
COPY . .

# 根据 COPY 过来的文件进行依赖的安装
RUN npm ci

# 设置好需要的环境变量
ENV NODE_PATH=/space/node_modules