我在Github Actions (with buildx)中使用build-push-action来构建Docker映像并将其推送到AWS ECR注册表。在我推送映像之前(不幸的是,它有几个GB),我想使用映像来运行容器化的Python测试。
build-push-action
有关于这个确切目标的文档-他们的示例建议构建映像,将其加载到Docker,使用docker run ...
然后推送。然而,虽然需要7分钟来构建映像(从下载的缓存),但需要另外7分钟才能将其加载到Docker-因此它使CI管道的时间增加了一倍。来自docs:
- 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
我的问题部分是基于对BuildX及其在示例工作流中的作用的错误假设。(我认为你必须使用builddx在行动中使用BuildKit,我们的Dockerfile使用了一些BuildKit功能)
我在Docker BuildX图像中找到了部分问题的答案,没有在Docker图像ls和博客文章中显示。
通过使用setup-buildx-action
步骤,BuildKit构建不直接加载到docker的多平台映像(因为您需要加载一个单平台映像)。我们目前不需要多平台构建,我们更喜欢CI的速度。因此,从工作流中删除setup-buildx-action
会导致单平台映像出现在docker images
中,并且可以立即用于运行测试(将单平台映像加载到docker没有明显的时间开销)。
。注释掉这个步骤有帮助:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
一旦我们的管道变得更加复杂和冗长,我们可能会再次开始构建多平台映像,但是现在,在运行中节省6分钟更有意义。
注:请随意添加您的答案/评论。我相信有一个比删除buildx设置更好的解决方案,我也想知道是否有一个智能的解决方案来构建多平台解决方案,并使图像快速加载到docker images
。