Github 操作:如何 运行 在由 build-push-action 构建的 docker 镜像中进行容器化测试,而不会使执行时间加倍
Github Actions: How to run containerized tests in a docker image built by build-push-action without doubling execution time
我在 Github 操作(使用 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
您是否知道有什么方法可以加快 up/shorten 加载时间 或如何以其他方式 运行 docker run
在图像上?似乎问题在于,对于加载,图像首先导出到 tarball,然后加载到 docker,这不会被任何类型的缓存加速。 (把图片推到ECR再拉回docker差不多快了。)但是,没有加载,我一直无法获取图像。
运行 tests inside 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
我的问题部分是基于对 BuildX 及其在示例工作流程中的作用的错误假设。 (我认为您必须使用 BuildX 才能在操作中使用 BuildKit,而我们的 Dockerfile 使用了一些 BuildKit 功能)
我在 and a 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 分钟更有意义。
注意:请随意添加您的 answers/comments。我相信有比删除 buildx 设置更好的解决方案,而且我想知道是否有用于构建多平台解决方案并将图像快速加载到 docker images
的智能解决方案。
我在 Github 操作(使用 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
您是否知道有什么方法可以加快 up/shorten 加载时间 或如何以其他方式 运行 docker run
在图像上?似乎问题在于,对于加载,图像首先导出到 tarball,然后加载到 docker,这不会被任何类型的缓存加速。 (把图片推到ECR再拉回docker差不多快了。)但是,没有加载,我一直无法获取图像。
运行 tests inside 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
我的问题部分是基于对 BuildX 及其在示例工作流程中的作用的错误假设。 (我认为您必须使用 BuildX 才能在操作中使用 BuildKit,而我们的 Dockerfile 使用了一些 BuildKit 功能)
我在
通过使用 setup-buildx-action
步骤,BuildKit 构建不会直接加载到 docker 中的多平台图像(因为您需要加载单平台图像)。我们目前不需要多平台构建,我们更喜欢 CI 的速度。因此从工作流中删除 setup-buildx-action
导致单平台图像出现在 docker images
中,它可以立即用于 运行 测试(没有明显的加载单平台时间开销)平台图像到 docker).
即注释掉这一步有帮助:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
一旦我们的管道变得更加复杂和冗长,我们可能会再次开始构建多平台图像,但现在,在 运行 上节省 6 分钟更有意义。
注意:请随意添加您的 answers/comments。我相信有比删除 buildx 设置更好的解决方案,而且我想知道是否有用于构建多平台解决方案并将图像快速加载到 docker images
的智能解决方案。