如何在GitHub Actions中缓存与重新加载Docker镜像?
在GitHub Actions中缓存自定义Docker镜像的实现方法
完全可行,通过结合GitHub官方的actions/cache Action和docker save/docker load命令就能实现自定义镜像的缓存,避免每次构建重复下载大体积镜像。具体实现步骤如下:
核心思路
- 用
docker save将镜像导出为本地tar文件 - 通过
actions/cache将tar文件缓存到GitHub的缓存系统中 - 下次构建时先尝试从缓存加载tar文件,用
docker load导入镜像;如果缓存不存在,再重新拉取镜像并保存到缓存
完整Workflow示例
name: Build with cached Docker image on: [push, pull_request] jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 # 定义缓存key,建议用镜像标签+哈希值,确保镜像更新时缓存自动失效 - name: Set cache key id: cache-key run: echo "key=my-custom-image-v1-${{ hashFiles('path/to/your/Dockerfile') }}" >> $GITHUB_OUTPUT # 加载缓存的镜像tar文件 - name: Restore Docker image cache uses: actions/cache@v3 id: cache with: path: ./my-custom-image.tar key: ${{ steps.cache-key.outputs.key }} restore-keys: | my-custom-image-v1- # 尝试从缓存加载镜像,失败则拉取镜像 - name: Load or pull Docker image run: | if [ -f ./my-custom-image.tar ]; then docker load < ./my-custom-image.tar else docker pull your-registry/my-custom-image:v1 fi # 执行你的构建任务 - name: Run build run: | docker run --rm your-registry/my-custom-image:v1 your-build-command # 如果缓存不存在,保存镜像到tar文件供下次缓存 - name: Save Docker image to cache if: steps.cache.outputs.cache-hit != 'true' run: docker save your-registry/my-custom-image:v1 > ./my-custom-image.tar
关键细节说明
- 缓存Key设计:用
hashFiles('path/to/your/Dockerfile')可以保证当Dockerfile修改时,缓存自动失效,重新拉取/构建新镜像;如果是直接拉取现成镜像,也可以用镜像的digest作为key,避免标签被覆盖导致缓存失效。 - 缓存路径:指定保存镜像tar文件的路径,确保
docker save和actions/cache的路径一致。 - 缓存命中判断:通过
steps.cache.outputs.cache-hit判断是否命中缓存,只有未命中时才执行docker save,避免重复操作。 - 大体积镜像处理:GitHub缓存支持最大10GB的文件,2GB的镜像完全符合要求,但注意缓存的保留时间(默认90天),如果镜像更新不频繁,缓存可以长期复用。
内容的提问来源于stack exchange,提问作者behnam rahmani
相关产品推荐
相关产品推荐

