能否从远程容器仓库恢复Docker构建缓存以加速CI构建?
我完全懂你的困扰——本地靠着Docker的构建缓存,每次构建ASP.NET应用都飞快,但到了AppVeyor的干净虚拟机环境里,每次都得从头开始拉取镜像、执行每一步构建,速度慢得让人抓狂。下面给你几个实用的解决办法:
1. 利用AppVeyor的缓存功能保存Docker层
AppVeyor本身提供了缓存机制,你可以把Docker的镜像层缓存下来,下次构建时直接复用。在你的appveyor.yml里添加以下配置:
cache: - C:\ProgramData\docker\tmp -> Dockerfile - C:\ProgramData\docker\windowsfilter -> Dockerfile
(注:如果是Linux环境的AppVeyor虚拟机,路径换成/var/lib/docker相关目录)
这样配置后,AppVeyor会把Docker的缓存目录和你的Dockerfile关联起来,只要Dockerfile没有变化,就会复用之前的缓存内容。
2. 优化Dockerfile的构建顺序
这是Docker构建缓存的基础技巧,但在CI环境里格外重要。把不常变化的步骤放在Dockerfile前面,比如基础镜像拉取、环境变量设置、工作目录创建,而把代码复制、还原依赖、编译这些频繁变化的步骤放在后面。
比如你的现有Dockerfile开头已经做得不错,再补充完整优化后的结构:
# 不常变化的基础镜像和环境配置,优先放前面 FROM microsoft/aspnetcore-build:2.0.0 as identity-build ENV DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true WORKDIR /publish # 先复制项目文件,还原依赖(这步变化频率低于代码修改) COPY *.csproj ./ RUN dotnet restore # 最后复制所有代码并编译(最常变化的步骤放最后) COPY . ./ RUN dotnet publish -c Release -o ./output
这样即使后面的代码变化,前面的基础层依然可以被缓存,减少重复执行的步骤。
3. 提前拉取基础镜像
在AppVeyor构建脚本的开头,手动拉取你的基础镜像,这样可以利用AppVeyor的镜像缓存(如果平台支持的话),避免每次构建都重新拉取大体积的ASP.NET Core构建镜像:
在appveyor.yml的install阶段添加:
install: - docker pull microsoft/aspnetcore-build:2.0.0
4. 复用中间镜像(进阶)
如果上面的方法还不够,你可以考虑把Docker的中间构建镜像推送到一个私有镜像仓库,每次构建时先拉取上次构建好的中间镜像,再基于它继续构建,最大化复用缓存。
比如在构建完成后,把identity-build阶段的镜像推送到仓库:
after_build: - docker tag identity-build your-repo/identity-build:latest - docker push your-repo/identity-build:latest
然后下次构建前先尝试拉取这个镜像:
before_build: - docker pull your-repo/identity-build:latest || true
这样Docker会自动识别可复用的镜像层,大幅加快构建速度。
内容的提问来源于stack exchange,提问作者James Skimming

