首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker :通过缓存重用容器映像

Docker :通过缓存重用容器映像
EN

Stack Overflow用户
提问于 2022-03-04 08:36:27
回答 2查看 2.4K关注 0票数 4

在这里,我在一个作业下有两个工作流。我们希望达到的唯一目标是,我们希望通过使用缓存或其他方法重用容器映像。对于node_modules,我们也是这样做的

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2022-03-20 18:48:44

为此,我建议使用码头工人的建造推进行动。通过build-push-action,您可以使用内联缓存、注册表缓存或实验性缓存后端API来缓存容器映像:

内联缓存

代码语言:javascript
复制
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

请参考Buildkit文档

注册表缓存

代码语言:javascript
复制
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

请参阅Buildkit文档

缓存后端API

代码语言:javascript
复制
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

请参阅Buildkit文档

我个人更喜欢使用Cache后端API作为它的易于设置,并提供了一个很大的推动,以减少总的CI管道运行时间。

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

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2022-03-07 08:01:38

通常,GitHub操作中的作业之间不共享数据。作业实际上将在不同的临时VM上并行运行,除非您使用需求显式地创建依赖项。

GHA确实提供了缓存机制。对于包管理器类型缓存,他们将其简化,请参见这里

对于坞映像,您可以使用docker缓存并将其缓存到远程注册表(包括ghcr),或者使用GHA 缓存动作,这可能更容易。操作/缓存的语法在页面上非常简单明了。对于buildx来说,文档始终是一个小问题(我认为,在很大程度上,因为他的构建非常聪明,以至于他们没有意识到我们有多么不了解他们心中的东西),所以您需要配置缓存操作,然后构建它来缓存它。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71348621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档