如何在 Github Action 中运行缓存的 Docker 镜像?

Iva*_*cec 16 image-caching docker github-actions

我不知道如何在 Github Actions 中运行缓存的 Docker 映像。
我按照有关发布 Docker 映像的教程来实现缓存、构建 Docker 映像并将其推送到 DockerHub 的任务。
我需要构建、缓存和运行图像,图像发布是可选的。
我的目标是加快 CI 工作流程。
以下是 Github Actions 工作流程:

name: CI

# Controls when the action will run. 
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - name: Check Out Repo
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v1 

      - name: Cache Docker layers
        uses: actions/cache@v2
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-buildx-

      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with: 
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          context: ./
          file: ./Dockerfile
          builder: ${{ steps.buildx.outputs.name }}
          push: true
          tags: ivan123123/c_matrix_library:latest
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      #- name: Run Docker container
      #  run: ???

      # Upload gcovr code coverage report
      - name: Upload GCC Code Coverage Report
        uses: actions/upload-artifact@v2
        with:
          name: coveragereport
          path: ./builddir/meson-logs/coveragereport/
        
      - name: Upload code coverage reports to codecov.io page
        run: bash <(curl -s https://codecov.io/bash) 

Run Code Online (Sandbox Code Playgroud)

编辑:
我没有找到运行缓存 Docker 映像的解决方案,但每次使用 docker/setup-buildx-action@v1 操作运行 CI 工作流程时,我都设法构建缓存映像。由于镜像已被缓存,我们不需要下载每个 Docker 镜像依赖项,从而节省了时间,从原来的 3 分钟缩短到仅 40 秒。以下是 Github Actions 工作流程:

name: CI

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Check Out Repo
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v1 

      - name: Cache register
        uses: actions/cache@v2
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ hashFiles('**/Dockerfile') }}

      - name: Build Docker image
        uses: docker/build-push-action@v2
        with:
          context: ./
          file: ./Dockerfile
          builder: ${{ steps.buildx.outputs.name }}
          load: true
          tags: c_matrix_library:latest
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Run Docker container
        run: docker run -v "$(pwd):/app" c_matrix_library:latest
Run Code Online (Sandbox Code Playgroud)

Luc*_*nte 10

如果您想缓存位于 Docker 存储库中的已发布 Docker 映像,您可以执行以下操作:

- name: Restore MySQL Image Cache if it exists
  id: cache-docker-mysql
  uses: actions/cache@v3
  with:
    path: ci/cache/docker/mysql
    key: cache-docker-mysql-5.7

- name: Update MySQL Image Cache if cache miss
  if: steps.cache-docker-mysql.outputs.cache-hit != 'true'
  run: docker pull mysql:5.7 && mkdir -p ci/cache/docker/mysql && docker image save mysql:5.7 --output ./ci/cache/docker/mysql/mysql-5.7.tar

- name: Use MySQL Image Cache if cache hit
  if: steps.cache-docker-mysql.outputs.cache-hit == 'true'
  run: docker image load --input ./ci/cache/docker/mysql/mysql-5.7.tar

- name: Start containers
  run: docker compose up -d
Run Code Online (Sandbox Code Playgroud)

当 docker compose up 运行时,如果某个服务使用 Docker 镜像mysql:5.7,它将跳过下载它。


ITC*_*hap 1

编辑:

正如罗曼在评论中提到的。初始解决方案将在工作流程开始时拉取映像,因此不会使用在工作流程期间构建的映像。唯一的解决方案似乎是docker run在步骤中自己运行:


- name: Run my docker image
  run: >
    docker run -t ivan123123/c_matrix_library:latest
    ...
Run Code Online (Sandbox Code Playgroud)

附带说明一下。如果您在工作中使用服务,那么使用此解决方案可能会变得有点复杂。这种情况下,你的容器和服务容器之间的联网就会很麻烦

原答案:

要运行图像,您可以使用以下命令:


- name: Run my docker image
  uses: docker://ivan123123/c_matrix_library:latest
  with:
    entrypoint: ...
    args: ...
Run Code Online (Sandbox Code Playgroud)

entrypointargs可选的。您可以在这里找到更多信息。但一个限制是您可以在该uses字段中使用任何变量或上下文。您只能对图像的名称和标签进行硬编码。