如何在GitHub Actions跨Job使用未推送的Docker工具镜像构建新镜像
问题分析
你遇到的核心问题是:Docker Buildx 默认使用的 docker-container 驱动是隔离运行的,它无法直接访问宿主 Docker daemon 中加载的镜像。你在第二个 Job 里用 docker load 把工具镜像加载到了本地 daemon,但 docker/build-push-action 依赖 Buildx 构建时,因为驱动隔离,找不到 tools:latest 镜像,导致 COPY --from 指令执行失败。
解决方案
以下两种方法都能解决这个问题,任选其一即可:
方法一:让 Buildx 使用本地 Docker daemon(切换驱动)
修改第二个 Job 中的「Set up Docker Buildx」步骤,指定使用 docker 驱动,这样 Buildx 会直接复用本地 Docker daemon 的镜像,就能访问到你加载的 tools:latest:
jobs: build-uses-tools: needs: build-tools runs-on: ubuntu-latest steps: - name: Checkout the repo uses: actions/checkout@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 with: driver: docker # 关键:切换到docker驱动 - name: Download tools image artifact uses: actions/download-artifact@v3 with: name: tools-image path: /tmp - name: Load tools image artifact run: | docker load --input /tmp/tools.tar docker image ls -a - name: Build uses tools image uses: docker/build-push-action@v4 with: load: true context: uses-tools
方法二:将工具镜像导入 Buildx 构建器
如果不想修改 Buildx 驱动,可以在加载镜像后,用 buildx imagetools import 把工具镜像导入到 Buildx 的构建器环境中,让 Buildx 能访问到它:
jobs: build-uses-tools: needs: build-tools runs-on: ubuntu-latest steps: - name: Checkout the repo uses: actions/checkout@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Download tools image artifact uses: actions/download-artifact@v3 with: name: tools-image path: /tmp - name: Load tools image artifact run: | docker load --input /tmp/tools.tar docker image ls -a # 新增步骤:将镜像导入Buildx构建器 - name: Import tools image to Buildx run: docker buildx imagetools import /tmp/tools.tar - name: Build uses tools image uses: docker/build-push-action@v4 with: load: true context: uses-tools
验证
修改后重新运行工作流,第二个 Job 的「Build uses tools image」步骤就能成功找到 tools:latest 镜像,完成 COPY --from 操作。
内容的提问来源于stack exchange,提问作者Logan
相关产品推荐
相关产品推荐

