Azure Pipelines Cache@2任务tar切换目录失败及缓存0MB问题咨询
目录不存在报错原因与修复
tar: could not chdir to 'D:\a\1\docker'报错是因为Azure Pipelines Cache任务要求配置的path路径必须提前存在,不管缓存命中还是未命中,任务都需要读写该路径,路径不存在就会抛出执行错误。
修复方案是在Cache任务执行前,新增步骤创建对应目录:
- Windows代理执行PowerShell命令:
New-Item -ItemType Directory -Path $(Pipeline.Workspace)/docker -Force
- Linux/macOS代理执行Bash命令:
mkdir -p $(Pipeline.Workspace)/docker
缓存大小为0MB问题修复
你需要自行将待缓存的Docker相关文件复制/导出到指定的$(Pipeline.Workspace)/docker路径下,Cache任务仅负责对指定路径的内容做上传、恢复操作,不会自动收集Docker镜像、构建层等缓存内容。
标准Docker缓存实现流程如下:
- 前置步骤创建缓存目录
- 执行Cache任务,恢复历史缓存内容
- 缓存命中时,将缓存目录中的Docker内容加载到运行环境,示例命令:
# 加载缓存的镜像文件 docker load -i $(Pipeline.Workspace)/docker/images.tar
- 执行Docker构建,可通过buildx参数直接将构建缓存写入指定目录:
docker buildx build \ --cache-from=type=local,src=$(Pipeline.Workspace)/docker/buildcache \ --cache-to=type=local,dest=$(Pipeline.Workspace)/docker/buildcache,mode=max \ -t 你的镜像标签 .
- 若需要缓存固定基础镜像,可在构建完成后将镜像导出到缓存目录:
docker save 基础镜像名:标签 -o $(Pipeline.Workspace)/docker/images.tar
- Pipeline运行结束后,Cache任务会自动将缓存目录下的所有新内容打包上传,供后续流水线使用。
优化建议
建议调整Cache任务的key规则,增加Dockerfile、依赖声明文件的哈希值作为key的组成部分,当依赖发生变化时自动生成新缓存,避免复用过期缓存,示例配置:
- task: Cache@2 inputs: key: 'docker | "$(Agent.OS)" | $(Build.SourcesDirectory)/Dockerfile | $(Build.SourcesDirectory)/package.json' path: '$(Pipeline.Workspace)/docker'
内容的提问来源于stack exchange,提问作者Dheeraj Palagiri
相关产品推荐
相关产品推荐

