GitHub使用技巧:利用Actions自动构建Docker应用

简介

GitHub Actions 可以在你推送代码到 GitHub 仓库时自动触发 Docker 镜像的构建和推送。这样你可以省去手动构建和推送镜像的麻烦,并确保每次代码更新后,新的 Docker 镜像能够立即更新到 Docker Hub 或其他容器注册表中。这不仅提高了效率,还减少了人为错误。

同时,GitHub Actions 中的 docker/build-push-action 提供了缓存功能。利用 cache-fromcache-to 参数,你可以缓存构建过程中重复的步骤(如安装依赖),从而减少不必要的重新构建过程,加速后续的构建。缓存功能可以大大提高构建效率,尤其是在频繁更新的项目中。

代码

name: Docker Build on Commit

on:
  push:
    branches:
      - master
    paths:
      - 'Dockerfile'
      - '**.js'
      - '**.css'
      - '**.py'
      - 'requirements.txt'

env:
  IMAGE_NAME: 【你的镜像名称】

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: 检出代码
        uses: actions/checkout@v3

      - name: 设置 Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: 登录到 Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ vars.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: 构建并推送 Docker 镜像
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: |
            ${{ vars.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest
          cache-from: type=registry,ref=${{ vars.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest
          cache-to: type=inline

注意

  1. branches修改为代码主分支的名称,可能为main、master或其他;

  2. paths修改为你需要在文件变化时触发构建流程的某些文件类型;

  3. IMAGE_NAME修改为你要构建的docker镜像名称;

触发条件(on)

  • 当代码推送到 main 分支时,并且改动包含 Dockerfiledocker-compose.yml、任意 .py 文件,或 requirements.txt 时,都会触发这个工作流。

  • 这样可以确保只有这些特定的文件发生变化时,才会触发构建过程,避免每次所有文件变化时都进行构建。

环境变量(env)

定义了一个全局环境变量 IMAGE_NAME,它的值是 stash-folder-view,后续会在多个地方引用。

作业流程(jobs)

  • 检出代码:这一步使用 actions/checkout action 将你的 GitHub 仓库代码检出到 runner(执行环境)中,使得后续步骤能够访问仓库中的文件。

  • 这一步设置 Docker Buildx,允许 Docker 使用多个平台进行构建,并支持缓存功能。这对多架构构建和加速构建非常重要。

  • 这一步使用 docker/login-action 登录到 Docker Hub。它使用存储在 GitHub Secrets 中的用户名和 token(安全凭证)来执行登录。成功登录后,可以推送镜像到 Docker Hub。

  • cache-from 指定了构建过程中可以使用的缓存镜像。在构建 Docker 镜像时,Docker 会检查是否已经存在相同的缓存,如果存在,它会使用该缓存以加速构建过程,避免重复构建相同的层(比如安装依赖、复制文件等)。如果指定了 cache-from,Docker 会尝试从指定的镜像中获取缓存。

    • type=registry: 指定缓存来自 Docker 仓库。

    • ref=${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest: 这是要作为缓存源的镜像标签。这里的 ${{ secrets.DOCKERHUB_USERNAME }}${{ env.IMAGE_NAME }} 是从你的 GitHub Actions 环境中动态获取的,latest 是标签。

    作用:这意味着 Docker 会尝试从 Docker Hub 上获取一个名为 latest 的镜像,检查是否能复用这些缓存来加速构建过程,避免重新执行那些不变的构建步骤。

  • cache-to 指定了缓存的输出位置,即将构建过程中的缓存数据保存到哪里。通常,cache-to 用于将构建过程中的缓存保存到 Docker 镜像中或者将其写入其他地方以供后续构建使用。

    • type=inline: 将缓存保存到构建生成的镜像内部。这意味着每次构建时,如果某些步骤的内容没有改变(比如相同的依赖库、文件等),Docker 会使用这个缓存,从而加速构建过程。

    作用:将缓存保存到生成的镜像中,可以帮助以后构建时使用这些缓存,进一步提高效率。

使用

注册docker hub账户

Docker Hub

生成docker hub token

Personal access tokens | Docker

添加仓库密钥

回到github仓库-Settings,下拉找到secrets and variables;

在Secrets中添加docker hub token,名称为DOCKERHUB_TOKEN;

在Variables中添加docker 用户名,名称为DOCKERHUB_USERNAME

添加Actions流程

点击仓库中的Actions,左侧New Workflow;

复制Actions代码到编辑器中,修改完成后提交即可。

提交代码

现在git push代码后,在Github Actions中应该能够看到正在编译的Docker镜像了


GitHub使用技巧:利用Actions自动构建Docker应用
https://blog.nasxyz.top/archives/077c3e64-0871-4cda-9ae4-fd51969a5bac
作者
kanochi
发布于
2025年02月11日
更新于
2025年02月11日
许可协议