跳至主要內容

GitHub Actions 定期編譯新的 Docker Hub Image

Last Updated on 2026-08-21 by william

最近在維護我的郵件伺服器專案 docker-Postfix-AD 時,發現了一個非常實用的自動化功能!

由於 Docker Hub 內建的自動編譯(Automated Builds)功能不僅需要付費,官方也宣布將在 2027 年全面退場。取而代之的現代主流作法,是利用 GitHub Actions 來幫我們處理 Docker 映像檔的自動編譯與推送

這篇文章將完整記錄如何設定一個同時支援「代碼推送自動編譯」+「每月定期安全更新」+「網頁手動一鍵觸發」的 CI/CD 工作流程!


架構


步驟一:準備 Docker Hub 憑證

  1. 登入你的 Docker Hub 帳號。
  2. 前往 Account Settings -> Security,建立一組 Access Token(存取權限代碼)並複製起來。
  3. 檢查權限:確保你的帳號在組織 inmethod 底下,對目標 Repository 擁有 Write(寫入) 以上的權限。

步驟二:在 GitHub 設定密鑰 (Secrets)

為了不讓帳號密碼外洩,我們必須把憑證鎖在 GitHub 安全儲存庫中:

  1. 進入你的 GitHub 專案,點選 Settings > Secrets and variables > Actions
  2. 新增兩個 Repository secrets:
    • DOCKER_USERNAME:填入你的 Docker Hub 帳號名稱。
    • DOCKER_PASSWORD:填入剛剛在 Docker Hub 產生的 Access Token。

步驟三:建立 GitHub Actions 設定檔

切換到你的預設分支 rspamd,在專案根目錄下建立 .github/workflows/docker-publish.yml 檔案,並貼入以下精心調校過的 YAML 設定:

yaml

name: Build and Push to Docker Hub

on:
  # 1. 當此預設分支 (rspamd) 有新代碼推送時,自動編譯
  push:
    branches: [ "rspamd" ] 
    
  # 2. 定期自動編譯:每月 1 號的 執行一次
  # 這在容器安全上很重要,就算代碼沒變,也能自動吃進 Linux 底層的安全更新!
  schedule:
    - cron: "0 2 1 * *"

  # 3. 支援手動觸發:在 GitHub 網頁會多出「Run workflow」按鈕,隨時可點
  workflow_dispatch:

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
      - name: 取得程式碼
        uses: actions/checkout@v4

      - name: 登入 Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: 建置並推送映像檔
        uses: docker/build-push-action@v6 
        with:
          context: .
          push: true          
          tags: inmethod/docker-postfix-ad:latest

注意事項

在設定過程中,有幾個關於 GitHub Actions 機制非常經典的「冷知識」,也是很多工程師常踩的坑:

  1. schedule(定時排程)只看預設分支(Default Branch)
    GitHub 的排程調度器非常死板,如果設定檔沒有存在於專案的「預設分支」中,schedulecron 就會完全被忽略。因為我的專案預設分支就是 rspamd(不是常規的 mainmaster),所以直接放進 rspamd 就能完美生效!
  2. Cron 語法的時間換算
    GitHub Actions 的時間一律是 UTC 時間。台灣時間(GMT+8)比它快 8 小時。因此設定 0 2 1 * *(UTC 每月 1 號 02:00),實際執行時間會是台灣時間的 每月 1 號上午 10:00
  3. YAML 語法的 tags: | 是什麼?
    在 YAML 中,直槓符號 | 代表「保留換行的多行字串」。當同一個 Image 想要同時打上多個 Tag(例如分支名跟 latest)時,用這個寫法最乾淨、閱讀性最高。

成果驗證

將檔案 Commit 並 Push 上去後,到 GitHub 專案的 Actions 分頁,就會看到工作流程順利啟動!跑完之後,Docker Hub 上的組織儲存庫就成功出現了剛出爐、帶有 latestrspamd 雙標籤的最新映像檔!

有了這個設定,以後專案維護就輕鬆多了。

分類:技術

搶先發佈留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

由 Compete Themes 設計的 Author 佈景主題