如何使用Azure Docker缓存任务Cache@2加速构建流水线并优化Azure上Docker构建速度?
当然可以用Cache@2任务来大幅提升Azure上的Docker构建速度!本地构建快是因为你的机器保留了之前的Docker构建缓存,而Azure DevOps的代理每次都是全新的干净环境,所以每次都得从头拉取依赖、构建所有镜像层,自然慢很多。下面我给你修改好的build.yml配置,直接就能用,还会给你解释每个部分的作用:
修改后的完整build.yml配置
trigger: branches: include: - main pool: vmImage: 'ubuntu-latest' steps: - checkout: self clean: true submodules: false # 缓存Docker构建层,让后续构建能复用之前的镜像层 - task: Cache@2 inputs: key: 'docker | "$(Agent.OS)" | ./MyService/Dockerfile' restoreKeys: | docker | "$(Agent.OS)" path: /var/lib/docker displayName: 'Cache Docker layers' - task: Docker@2 inputs: containerRegistry: 'MyDockerHub' repository: 'myRepo/myservice' command: 'buildAndPush' Dockerfile: './MyService/Dockerfile' buildContext: './' tags: | $(Build.BuildId) latest # 告诉Docker使用我们缓存的本地镜像层 arguments: '--cache-from=type=local,src=/var/lib/docker'
关键部分解释
- Cache@2任务:
key:这个是缓存的唯一标识,由三个部分组成:docker标记缓存类型、$(Agent.OS)确保不同操作系统的缓存不混淆、./MyService/Dockerfile保证当你的Dockerfile修改时,会自动失效旧缓存,重新构建所有层。restoreKeys:如果找不到完全匹配的key,会回退到同一操作系统的Docker缓存,尽量复用之前的构建内容。path:指定要缓存的Docker核心目录/var/lib/docker,这里存储了所有镜像层和构建缓存,正是本地构建快的关键所在。
- Docker@2任务的arguments:添加
--cache-from=type=local,src=/var/lib/docker,明确告诉Docker使用我们恢复的缓存目录来复用镜像层,避免重复构建。
额外优化(针对有包管理的项目)
如果你的项目用了npm、pip这类包管理工具,还可以额外缓存项目依赖文件夹,让Docker的依赖安装步骤更快复用。比如Node.js项目可以加这一步在Docker任务之前:
- task: Cache@2 inputs: key: 'npm | "$(Agent.OS)" | ./MyService/package-lock.json' restoreKeys: | npm | "$(Agent.OS)" path: ./MyService/node_modules displayName: 'Cache Node.js dependencies'
记得你的Dockerfile要先COPYpackage.json/package-lock.json,再执行npm install,最后COPY其他代码——这样只要依赖文件不变,Docker就会直接复用这一层的缓存。
效果说明
第一次配置后构建还是会慢(因为要生成缓存并上传到Azure存储),但从第二次构建开始,就能直接恢复缓存,构建速度会和本地差不多,节省大量时间。
内容的提问来源于stack exchange,提问作者Milos
相关产品推荐
相关产品推荐

