如何在GitHub Actions中缓存Docker依赖镜像与自定义镜像?
缓存Docker镜像加速GitHub Action工作流
针对你的场景,有两种高效方法可以缓存Docker基础镜像,避免每次工作流重复拉取:
方法一:手动导出/导入镜像并使用GitHub缓存
通过将基础镜像导出为tar包,利用actions/cache缓存这些tar包,下次运行时直接导入到Docker中:
# 缓存Docker镜像tar包 - name: Cache Docker images id: cache-docker uses: actions/cache@v3 with: path: ./docker-image-cache # 用Dockerfile哈希做key,确保镜像更新时重新缓存 key: docker-images-${{ hashFiles('Dockerfile') }} # 从缓存导入镜像 - name: Load cached images if: steps.cache-docker.outputs.cache-hit == 'true' run: | docker load -i ./docker-image-cache/mcr-aspnet-7.0.tar docker load -i ./docker-image-cache/holism-api.tar # 拉取镜像并保存到缓存目录 - name: Pull and save images if: steps.cache-docker.outputs.cache-hit != 'true' run: | mkdir -p ./docker-image-cache docker pull mcr.microsoft.com/dotnet/aspnet:7.0 docker save -o ./docker-image-cache/mcr-aspnet-7.0.tar mcr.microsoft.com/dotnet/aspnet:7.0 docker pull holism/api docker save -o ./docker-image-cache/holism-api.tar holism/api # 执行构建 - name: Build production docker run: docker build -t custom/image --no-cache --progress=plain
注意:如果你的基础镜像tag固定(比如7.0或latest),可以把tag加入缓存key,避免Dockerfile未变更但镜像更新时缓存失效。
方法二:使用docker/build-push-action自动缓存
官方的docker/build-push-action集成了GitHub缓存功能,无需手动处理镜像拉取和导出,直接在构建时复用缓存:
- name: Build production docker uses: docker/build-push-action@v5 with: context: . tags: custom/image no-cache: true # 若不需要缓存自身构建层则保留,否则移除 cache-from: type=gha cache-to: type=gha,mode=max
这个方法会自动将构建过程中的所有镜像层(包括基础镜像)缓存到GitHub的缓存服务中,下次构建时直接复用,大幅减少拉取时间。
关键注意事项
- GitHub缓存有10GB仓库存储上限,且未访问的缓存会在30天后自动删除,合理设置缓存key避免冗余缓存。
- 如果使用
--no-cache构建参数,仅会禁用自身构建层的缓存,基础镜像的缓存依然生效。
内容的提问来源于stack exchange,提问作者Ali EXE
相关产品推荐
相关产品推荐

