如何在 GitHub Actions 中实现多阶段 Docker 构建?

6

问题

我有一个多阶段(两个阶段)的 Docker 构建容器,让我们称其为cont,我希望通过 GitHub Actions 自动化此过程。构建过程的第一个阶段/docker-image 很少更改,并且构建时间很长; 我们将其称为cont-build。我想通过不每次构建整个项目时都构建cont-build来减少构建时间。

在本地运行该构建时,我可以通过本地 Docker 实例轻松获得cont-build镜像。 我很难将这种简单的可用性转移到 GitHub Actions 中。

我查看了 Docker 和 GitHub 文档,但无法找到实现它的方法。 在本地机器上如此简单,所以我认为在 GitHub-Actions 上也不应该太难...

方法

为了保持cont-build图像,似乎有不同的方法

  • 使用某种 GitHub 缓存。我不确定图像缓存的持续时间。
  • 从 DockerHub 拉取镜像,在构建时间很长的情况下可能比构建更快

对于我来说,第二个方法似乎更直截了当而且不太复杂。因此,我的方法是将cont-build发布到 DockerHub,并在每次构建cont时从 DockerHub 拉取cont-build

我尝试使用uses: Docker://${{ secrets.DOCKERHUB_USERNAME }}/cont-build,但不知道应该把它放在哪里。

问题

我应该在何处/如何拉取所需的Dockerfile-cont“构建和推送”中需要的cont-build镜像? 此外,如果我的方法不好,那么对于一个构建的其中一个阶段很少更改的多阶段构建,特别是考虑到 GitHub 缓存可能在一段时间后被删除,整个通用方法是什么?

我意识到可以在Dockerfile-cont中使用类似于FROM mydockerID/cont-build:latest的东西,但这似乎不是利用整个 GitHub-Workflow 环境的解决方案。这还意味着我必须以明文输入我的 docker-ID,而不是使用 GitHub-Secret。

name: CI for cont

on: workflow_dispatch

jobs:
  docker:
    runs-on: ubuntu-latest    
    steps:
      -
        name: Checkout
        uses: actions/checkout@v2      
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1        
      -
        name: Login to DockerHub
        uses: docker/login-action@v1         
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      -
        name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2     
        with:
          context: ./Code/
          file: ./Code/Dockerfile-cont
          push: true
          tags: ${{ secrets.DOCKERHUB_USERNAME }}/cont:latest
      -
        name: Image digest                  
        run: echo ${{ steps.docker_build.outputs.digest }}

1个回答

3
多阶段构建的问题在于,如果您想要缓存起作用,则需要:
  1. 访问中间阶段以及重建的一部分。
  2. 使用--cache-from引用先前的映像,包括中间步骤。
如果考虑重建的工作原理,如果您缺少中间阶段,构建器将会“嗯,我猜我没有缓存”,并重新构建;它无法确定最终阶段是否需要重建,直到完成所有先前的步骤。
因此,您需要进行以下操作,假设有两个阶段,“build”和“runtime”:
  1. 拉取“yourimage:latest”和“yourimage:build”。
  2. 构建并标记每个中间阶段,例如“yourimage:build”,“yourimage:latest”,带有--cache-from=yourimage:build --cache-from=yourimage:latest
  3. 推送这两个映像。
您可以在https://pythonspeed.com/articles/faster-multi-stage-builds/上查看具体细节和更多扩展说明以及示例解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接