GitHub使用技巧:利用Actions自动构建Docker应用
简介
GitHub Actions 可以在你推送代码到 GitHub 仓库时自动触发 Docker 镜像的构建和推送。这样你可以省去手动构建和推送镜像的麻烦,并确保每次代码更新后,新的 Docker 镜像能够立即更新到 Docker Hub 或其他容器注册表中。这不仅提高了效率,还减少了人为错误。
同时,GitHub Actions 中的 docker/build-push-action
提供了缓存功能。利用 cache-from
和 cache-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
注意
branches修改为代码主分支的名称,可能为main、master或其他;
paths修改为你需要在文件变化时触发构建流程的某些文件类型;
IMAGE_NAME修改为你要构建的docker镜像名称;
触发条件(on)
当代码推送到
main
分支时,并且改动包含Dockerfile
、docker-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 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镜像了