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
,它将跳过下载它。
编辑:
正如罗曼在评论中提到的。初始解决方案将在工作流程开始时拉取映像,因此不会使用在工作流程期间构建的映像。唯一的解决方案似乎是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)
和entrypoint
是args
可选的。您可以在这里找到更多信息。但一个限制是您可以在该uses
字段中使用任何变量或上下文。您只能对图像的名称和标签进行硬编码。
归档时间: |
|
查看次数: |
22705 次 |
最近记录: |