如何利用GHA Docker缓存加速GitHub Actions上的Docker构建与拉取运行
核心原因
你配置的cache-to/cache-from是Docker Buildx的构建层缓存,仅用于加速镜像构建过程,不会自动将构建完成的镜像加载到GitHub Actions运行环境的本地Docker daemon镜像列表中。因此执行docker run时识别不到本地存在对应镜像,就会主动从Registry拉取。
解决方法
场景1:构建和docker run在同一个Job内执行
这是最常见的场景,直接在docker/build-push-action配置中添加load: true参数即可,该参数会将构建完成的镜像直接加载到本地Docker daemon中,后续docker run会优先使用本地镜像,不会触发拉取操作。
示例配置:
- name: Build Docker image uses: docker/build-push-action@v5 with: context: . tags: ghcr.io/org/image:new-tag cache-from: type=gha cache-to: type=gha,mode=max # 新增以下参数 load: true
如果需要同时将镜像推送到Registry,需额外添加provenance: false参数(默认生成的多架构 attestation 镜像不支持同时load和push):
- name: Build and push Docker image uses: docker/build-push-action@v5 with: context: . tags: ghcr.io/org/image:new-tag cache-from: type=gha cache-to: type=gha,mode=max load: true push: true provenance: false
场景2:构建和docker run在不同Job内执行
此时不同Job的运行环境隔离,本地Docker daemon不共享,你可以将构建好的镜像导出为tar包,通过GHA缓存存储,在执行run的Job中导入镜像即可:
构建Job配置示例
jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build Docker image uses: docker/build-push-action@v5 with: context: . tags: ghcr.io/org/image:new-tag cache-from: type=gha cache-to: type=gha,mode=max outputs: type=docker,dest=/tmp/my-image.tar - name: Upload image to cache uses: actions/cache@v3 with: path: /tmp/my-image.tar key: docker-image-${{ github.sha }}
运行Job配置示例
run: runs-on: ubuntu-latest needs: build steps: - name: Load image from cache uses: actions/cache@v3 with: path: /tmp/my-image.tar key: docker-image-${{ github.sha }} - name: Import image to local Docker run: docker load -i /tmp/my-image.tar - name: Run command in image run: docker run ghcr.io/org/image:new-tag command
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

