Image 是 CI-CD 流水線上唯一的交付物
主張:Docker 真正改變工程實務的地方,不是「方便」,而是讓整條流水線上流動的是同一份 image——開發、測試、正式跑的是同一份位元組。
1 開發:寫 code + Dockerfile,本機 compose 起環境
2 推 Git:Dockerfile 也進版控
3 CI:跑測試 + docker build,tag = commit SHA
4 Registry:docker push
5 測試/正式:docker pull + run — 跑的是 CI build 出來的同一份 image
規模再大 → Compose / Kubernetes 編排層為什麼用 commit SHA 當 tag
它唯一、不可變、而且能直接對應回原始碼。出事時可以精準說出「正式環境跑的是 a3f2b1c 這個 commit」,也能一行指令回滾到上一個 SHA。
- run: docker build -t ghcr.io/${{ github.repository }}:${{ github.sha }} .
- run: docker push ghcr.io/${{ github.repository }}:${{ github.sha }}這也是為什麼 正式環境不要用 latest tag——會移動的標籤讓「同一份位元組」這個保證直接失效。
同一份 image 要能跑在 dev / staging / prod,靠的是環境變數而不是為每個環境 build 不同 image → 容器設計原則:單一職責、無狀態、設定走環境變數。