Last Updated on 2026-08-21 by william
最近在維護我的郵件伺服器專案 docker-Postfix-AD 時,發現了一個非常實用的自動化功能!
由於 Docker Hub 內建的自動編譯(Automated Builds)功能不僅需要付費,官方也宣布將在 2027 年全面退場。取而代之的現代主流作法,是利用 GitHub Actions 來幫我們處理 Docker 映像檔的自動編譯與推送。
這篇文章將完整記錄如何設定一個同時支援「代碼推送自動編譯」+「每月定期安全更新」+「網頁手動一鍵觸發」的 CI/CD 工作流程!

架構
- GitHub 專案:
WilliamFromTW/docker-Postfix-AD - 預設主分支:
rspamd - Docker Hub 目的地:組織帳號
inmethod底下的docker-postfix-ad儲存庫
步驟一:準備 Docker Hub 憑證
- 登入你的 Docker Hub 帳號。
- 前往 Account Settings -> Security,建立一組 Access Token(存取權限代碼)並複製起來。
- 檢查權限:確保你的帳號在組織
inmethod底下,對目標 Repository 擁有 Write(寫入) 以上的權限。
步驟二:在 GitHub 設定密鑰 (Secrets)
為了不讓帳號密碼外洩,我們必須把憑證鎖在 GitHub 安全儲存庫中:
- 進入你的 GitHub 專案,點選 Settings > Secrets and variables > Actions。
- 新增兩個 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 機制非常經典的「冷知識」,也是很多工程師常踩的坑:
schedule(定時排程)只看預設分支(Default Branch)
GitHub 的排程調度器非常死板,如果設定檔沒有存在於專案的「預設分支」中,schedule的cron就會完全被忽略。因為我的專案預設分支就是rspamd(不是常規的main或master),所以直接放進rspamd就能完美生效!- Cron 語法的時間換算
GitHub Actions 的時間一律是 UTC 時間。台灣時間(GMT+8)比它快 8 小時。因此設定0 2 1 * *(UTC 每月 1 號 02:00),實際執行時間會是台灣時間的 每月 1 號上午 10:00。 - YAML 語法的
tags: |是什麼?
在 YAML 中,直槓符號|代表「保留換行的多行字串」。當同一個 Image 想要同時打上多個 Tag(例如分支名跟latest)時,用這個寫法最乾淨、閱讀性最高。
成果驗證
將檔案 Commit 並 Push 上去後,到 GitHub 專案的 Actions 分頁,就會看到工作流程順利啟動!跑完之後,Docker Hub 上的組織儲存庫就成功出現了剛出爐、帶有 latest 與 rspamd 雙標籤的最新映像檔!
有了這個設定,以後專案維護就輕鬆多了。

搶先發佈留言