【问题标题】:Github Actions: How to run containerized tests in a docker image built by build-push-action without doubling execution timeGithub Actions:如何在 build-push-action 构建的 docker 镜像中运行容器化测试,而不会使执行时间加倍
【发布时间】:2021-11-22 12:27:08
【问题描述】:

我在 Github Actions(使用 buildx)中使用 build-push-action 构建 Docker 映像并将其推送到 AWS ECR 注册表。在推送映像之前(不幸的是,它有几个 GB),我想使用该映像来运行容器化 Python 测试。

build-push-action 有 docs 在这个确切的目标上 - 他们的示例建议构建映像,将其加载到 Docker,使用 docker run ... 然后推送。然而,虽然构建映像(从下载的缓存)需要 7 分钟,但将其加载到 Docker 需要另外 7 分钟 - 因此 CI 管道的时间增加了一倍。文档中的示例:


      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Build and export to Docker
        uses: docker/build-push-action@v2
        with:
          context: .
          load: true
          tags: ${{ env.TEST_TAG }}
      - name: Test
        run: |
          docker run --rm ${{ env.TEST_TAG }}
      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: true
          tags: user/app:latest

您是否知道任何加快/缩短加载时间的方法或如何以其他方式在图像上运行docker run?似乎问题在于,对于加载,图像首先导出到 tarball,然后加载到 docker,任何类型的缓存都不会加速。 (将图像推送到 ECR 并将其拉回 docker 几乎更快。)但是,没有加载,我无法获取图像。

在 Dockerfile 中运行测试是一种有效的快速解决方法。但随后我们遇到了同样的问题 - 如何在不进行肮脏黑客攻击的情况下获取输出文件(例如覆盖率统计信息)。

谢谢。

为了完整起见,在我想要放置测试的地方添加我的真实示例:


- name: Login to Amazon ECR
  id: login-ecr
  uses: aws-actions/amazon-ecr-login@v1

- name: Set up Docker Buildx
  uses: docker/setup-buildx-action@v1

- name: Build Image and Push to ECR
  uses: docker/build-push-action@v2
  env:
    ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
  with:
    context: .
    push: true
    build-args: |
      build_id=${{ github.sha }}
    tags: |
      ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest
    cache-from: type=registry,ref=${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest
    cache-to: type=inline

【问题讨论】:

    标签: docker github-actions amazon-ecr


    【解决方案1】:

    我的问题部分基于对 BuildX 及其在示例工作流程中的作用的错误假设。 (我认为您必须使用 BuildX 才能在操作中使用 BuildKit,而我们的 Dockerfile 使用了一些 BuildKit 功能)

    我在Docker BuildX image not showing in docker image ls 和blog post Multi-arch build and images, the simple way 中部分找到了我的问题的答案。

    通过使用setup-buildx-action 步骤,BuildKit 构建不直接加载到 docker 中的多平台镜像(因为您需要加载单平台镜像)。我们目前不需要多平台构建,我们更喜欢 CI 的速度。因此,从工作流中删除 setup-buildx-action 会导致单平台图像出现在 docker images 中,并且可以立即用于运行测试(将单平台图像加载到 docker 没有明显的时间开销)。

    即注释掉这一步有帮助:

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1
    

    一旦我们的流水线变得更加复杂和冗长,我们可能会再次开始构建多平台图像,但现在,节省 6 分钟的运行时间更有意义。

    注意:请随意添加您的答案/cmets。我相信有比删除 buildx 设置更好的解决方案,而且我想知道是否有一个智能解决方案可以构建多平台解决方案并将图像快速加载到docker images。

    【讨论】:

      猜你喜欢
      • 2021-01-01
      • 2023-02-21
      • 2023-03-02
      • 2021-12-10
      • 2021-01-29
      • 2022-11-11
      • 1970-01-01
      • 2023-02-17
      • 2021-06-05
      相关资源
      最近更新 更多