Docker 缓存
docker:cache
构建一个 Docker
缓存,在未来的构建中重复使用。
可以避免网络资源如 依赖包
重复下载。
# 适用事件
all
# 参数
- dockerfile
- by
- versionBy
- buildArgs
- target
- dockerImageName
- dockerUser
- dockerPassword
- sync
- ignoreBuildArgsInVersion
# 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
await →