Docker:通过缓存重用容器镜像

Shy*_*mar 6 github docker dockerfile docker-compose github-actions

这里我在一个作业下有两个工作流程。我们想要实现的唯一目标是,我们希望通过缓存或其他方式重用容器镜像。我们对node_modules 的做法类似

jobs:
    build:
        name: build
        runs-on: [self-hosted, x64, linux, research]
        container:
          image: <sample docker image>
        env:
          NPM_AUTH_TOKEN: <sample token>
        steps:
          - uses: actions/checkout@v2
          - name: Install
            run: |
              npm install
          - name: Build
            run: |
          npm build
    Test:
        name: Test Lint
        runs-on: [self-hosted, x64, linux, research]
        container:
          image: <sample docker image>
        env:
          NPM_AUTH_TOKEN: <sample token>
        steps:
          - uses: actions/checkout@v2
          - name: Install Dependencies
            run: npm ci
          - name: Lint Check
            run: npm run lint
Run Code Online (Sandbox Code Playgroud)

小智 6

我建议使用Docker 的 Build Push 操作来实现此目的。通过build-push-action,您可以使用内联缓存、注册表缓存或实验性缓存后端 API 来缓存容器映像:

内联缓存

name: Build and push
uses: docker/build-push-action@v2
with:
    context: .
    push: true
    tags: user/app:latest
    cache-from: type=registry,ref=user/app:latest
    cache-to: type=inline
Run Code Online (Sandbox Code Playgroud)

请参阅Buildkit 文档

注册表缓存

name: Build and push
uses: docker/build-push-action@v2
with:
    context: .
    push: true
    tags: user/app:latest
    cache-from: type=registry,ref=user/app:buildcache
    cache-to: type=registry,ref=user/app:buildcache,mode=max
Run Code Online (Sandbox Code Playgroud)

请参阅Buildkit 文档

缓存后端API

name: Build and push
uses: docker/build-push-action@v2
with:
    context: .
    push: true
    tags: user/app:latest
    cache-from: type=gha
    cache-to: type=gha,mode=max
Run Code Online (Sandbox Code Playgroud)

请参阅Buildkit 文档

我个人更喜欢使用缓存后端 API,因为它易于设置,并且可以极大地缩短整体 CI 管道的运行持续时间。


通过查看评论,您似乎想在工作流程之间共享 Docker 缓存。在这种情况下,您可以使用以下示例在工作流程中的作业之间共享 Docker 容器:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v2
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      -
        name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./Dockerfile
          tags: myimage:latest
          outputs: type=docker,dest=/tmp/myimage.tar
      -
        name: Upload artifact
        uses: actions/upload-artifact@v2
        with:
          name: myimage
          path: /tmp/myimage.tar

  use:
    runs-on: ubuntu-latest
    needs: build
    steps:
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      -
        name: Download artifact
        uses: actions/download-artifact@v2
        with:
          name: myimage
          path: /tmp
      -
        name: Load Docker image
        run: |
          docker load --input /tmp/myimage.tar
          docker image ls -a
Run Code Online (Sandbox Code Playgroud)


dei*_*tch 4

一般来说,GitHub Actions (GHA) 中的作业之间不会共享数据。作业实际上会在不同的临时虚拟机上并行运行,除非您显式创建需求依赖项

GHA确实提供了缓存机制。对于包管理器类型缓存,他们简化了它,请参阅此处

对于 docker 镜像,您可以使用 docker buildx 缓存并缓存到远程注册表(包括 ghcr),或者使用 GHA缓存操作,这可能更容易。actions/cache 的语法在页面上非常简单明了。对于 buildx 来说,文档总是有点问题(我认为主要是因为构建它的人非常聪明,他们没有意识到我们有多么不了解他们内心的想法),所以你需要配置缓存操作,然后 buildx 来缓存它。

或者,您可以docker save imagename > imagename.tar在缓存中执行并使用它。这里有一个很好的例子。不知道是谁写的,但它确实有效。