链接:https://zhuanlan.zhihu.com/p/1985333395300050862
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
说实话,你是不是也经历过这种“垃圾时间”:
代码终于写完了,兴冲冲地在本地终端敲下docker build,然后……
电脑风扇开始狂转,CPU 温度飙升,你甚至不敢切出去看视频,生怕卡顿。好不容易构建完了,还要docker push,盯着那个慢吞吞的进度条,祈祷网络别断。
这一套流程下来,少说十几二十分钟没了。如果中间发现有个标点符号写错了?好家伙,推倒重来。
这就叫“被工具玩了”,而不是“玩工具”。
今天我要给大家安利一个我用了很久、相见恨晚的神器组合:GitHub Actions + Docker Hub。
简单说,就是把“构建”和“上传”这两件费时费力的事,从你的本地电脑,转移到 GitHub 的服务器上去做。
Github Action 是 Github 推出的一个持续集成和持续交付的平台,能够让你自动化你的编译、测试和部署流程。
重点是:它完全免费,速度飞快,而且全自动。
这就好比你写好菜谱(代码),不用自己进厨房(本地构建),直接把菜谱扔给微软请的免费大厨(GitHub Actions),他做好了直接端上桌(发布到 Docker Hub)。
怎么搞?我不整那些虚头巴脑的概念,直接上实操,保姆级教程,包教包会。
第一步:准备好你的“菜谱”和“厨房”
首先,你得有个 GitHub 账号,和一个 Docker Hub 账号(存镜像的地方)。
在你的 GitHub 项目里,必须得有一个Dockerfile。这个大家都懂,就是告诉机器怎么打包你的程序。
第二步:把“钥匙”交给 GitHub(关键!)
这是很多新手最容易卡住的地方。
你要让 GitHub 帮你上传镜像,你得给它权限,但你肯定不能把密码直接写在代码里吧?那样全世界都看见了。
正确做法是这样:
1.打开你的 GitHub 仓库,点击Settings(设置)。

2.找到左侧的Secrets and variables->Actions。
3.点击New repository secret。
我们需要添加两个“暗号”:
- DOCKER_USERNAME:填你的 Docker Hub 用户名。
- DOCKER_PASSWORD:填你的 Docker Hub 密码(或者 Access Token,建议用 Token 更安全)。
这样,GitHub 就在后台悄悄记住了你的身份,别人看代码是绝对看不到的。
第三步:告诉保姆“该干活了”
接下来,我们要写一个脚本,告诉 GitHub:“嘿,只要我更新了代码,你就立刻帮我干活!”
在你的项目根目录下,建立一个文件夹:.github/workflows(注意前面的点)。 在里面新建一个文件,名字随便取,比如docker-publish.yml。
复制下面这段代码进去(虽然是代码,但很好懂,我加了人话注释):
name: Build and Push Docker Image
on:
push:
branches: [ master ] # 构建的分支,可以根据需要修改
pull_request:
branches: [ master ] # 触发构建的分支,可以根据需要修改
workflow_dispatch: # 添加 workflow_dispatch 事件,支持手动触发
jobs:
build:
name: Push Docker image to multiple registries
runs-on: ubuntu-latest
# 显式声明权限,遵循最小权限原则
permissions:
packages: write # 推送镜像到 GHCR
contents: read # 读取源码
attestations: write # 写入构建证明
id-token: write # OIDC 认证,用于签名
steps:
# 1. 检出代码
- name: Check out the repo
uses: actions/checkout@v4
# 2. 安装 QEMU (支持 ARM64 等多架构)
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
# 3. 初始化 Buildx (使用 docker-container 驱动)
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# 4. 登录 Docker Hub
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# 5. 登录 Registry
- name: Log in to the Container registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# 6. 生成元数据 (Tags & Labels)
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: |
jumploop/webssh # Docker Hub仓库名称
ghcr.io/${{ github.repository }}
tags: |
latest
${{ github.sha }}
# 7. 构建并推送 (核心步骤)
- name: Build and push Docker images
id: push
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
push: true
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
# 8. 镜像签名与证明 (增强安全性)
- name: Generate artifact attestation
uses: actions/attest-build-provenance@v2
with:
subject-name: ghcr.io/${{ github.repository }}
subject-digest: ${{ steps.push.outputs.digest }}
push-to-registry: true
第四步:见证奇迹
保存,提交代码,Push 到 GitHub。
打开 GitHub 仓库的Actions标签页,你会看到一个小绿点在转圈。点进去,你会发现 GitHub 的服务器正在疯狂为你通过云端宽带拉取依赖、编译代码。


通常几分钟后,那个圈圈变成绿色的对号。

这时候你去 Docker Hub 刷新一下,崭新的镜像已经躺在那儿了。

写在最后
为什么要折腾这个?
除了省电省网费,更重要的是它能让你养成“自动化”的思维。
以后无论你在哪里,用着多烂的电脑,甚至是用 iPad 写代码,只要你把代码往 GitHub 一推,云端的流水线就开始自动运转。
等哪天服务器挂了,你只需要一条拉取命令就能恢复,而不是满头大汗地在本地重新打包。
把重复的工作交给机器,把时间留给自己。这才是程序员该有的“偷懒”方式。
趁热打铁,现在就去给你的项目加个 Actions 吧,那种看着绿灯自动亮起的感觉,真的很爽。
