You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合GitHub build-push-action在自建容器镜像中运行作业?

解决GitHub Actions构建镜像后跨作业作为容器运行的问题

你遇到的核心问题是:GitHub Actions的作业是隔离的,container字段在作业启动时就会尝试拉取镜像,这时候你构建的自定义镜像还没被加载到runner上,所以无法直接用container: node_builder:latest。正确的做法是先在build作业中把镜像导出为tar包并上传为artifact,然后在run作业中下载、加载镜像,最后通过docker run在容器内执行命令。

完整工作流配置

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4

      - name: 配置Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: 构建镜像并导出为tar包
        uses: docker/build-push-action@v4
        with:
          target: node_builder
          tags: node_builder:latest
          # 将构建好的镜像导出到本地tar文件
          outputs: type=docker,dest=/tmp/node_builder.tar

      - name: 上传镜像作为artifact
        uses: actions/upload-artifact@v3
        with:
          name: node_builder
          path: /tmp/node_builder.tar
          # 可选:设置artifact保留天数,避免占用存储空间
          retention-days: 1

  run:
    # 依赖build作业完成
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: 下载镜像artifact
        uses: actions/download-artifact@v3
        with:
          name: node_builder
          path: /tmp

      - name: 加载镜像到Docker本地仓库
        run: docker load --input /tmp/node_builder.tar

      - name: 在构建好的容器内执行命令
        run: |
          docker run --rm node_builder:latest \
            sh -c "
              # 替换为你需要执行的实际命令
              echo '容器内执行中...'
              node --version
              # 示例:安装依赖、运行测试
              # npm install
              # npm run test
            "

关键说明

  1. 镜像导出:在build-push-action中通过outputs参数将构建好的镜像导出为本地tar包,这是实现跨作业共享的核心,无需推送镜像到外部仓库。
  2. Artifact传递:使用upload-artifact和download-artifact在隔离的作业间传递镜像tar包。
  3. 容器运行方式:不能直接使用作业级别的container字段(因为作业启动时镜像还未加载),而是通过docker run命令手动启动容器并执行所需命令,确保镜像已加载后再运行容器内的逻辑。

内容的提问来源于stack exchange,提问作者gremo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 15:00:07