Docker 缓存

docker:cache

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

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

# 适用事件

all

# 参数

# dockerfile

  • type: String
  • required:

用于构建缓存的 Dockerfile 路径。

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

# by

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

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

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

# versionBy

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

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

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

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

# buildArgs

  • type: Object
  • required:

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

# target

  • type: String
  • required:

对应 docker build 时候 --target 参数, 用于将 dockerfile 中某个镜像作为缓存。

# dockerImageName

  • type: String
  • required:

指定缓存镜像的镜像名(不含tag)

如:team-docker.pkg.coding.net/projct/docker-cache

不指定时,则只把只把镜像缓存在当前构建机

# dockerUser

  • type: String
  • required:

指定 docker 用户名,用户推送和拉取缓存镜像

指定 dockerImageName 时必须指定,否则会出现没有权限的情况

# dockerPassword

  • type: String
  • required:

指定docker用户密码,用户推送和拉取缓存镜像

指定 dockerImageName 时必须指定,否则会出现没有权限的情况

# sync

  • type: Boolean
  • required:
  • default: false

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

# ignoreBuildArgsInVersion

  • type: Boolean
  • required:
  • default: false

版本计算是否忽略 buildArgs

详见版本控制

# 输出结果

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

# 配置样例

master:
  push:
    - docker:
        image: node:14
      stages:
        - name: build cache image
          type: docker:cache
          options:
            dockerfile: cache.dockerfile
            # by 支持以下两种形式:数组、字符串
            by:
              - package.json
              - package-lock.json
            # by: package.json,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 (opens new window)。示例:

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

# 设置工作目录
WORKDIR /space

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

# 根据 COPY 过来的文件进行依赖的安装
RUN npm ci --registry=https://mirrors.xxx.com/npm/

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