Skip to content
All writing Part 01 of 09 · 一次 Golang 版本升級的連鎖反應
Engineering · 1 min read

組合 base image 前先查 tag 矩陣

手動拼湊 base image 之前,先查 Docker Hub 的 tag 矩陣。你要的 Golang × Alpine 組合通常已經發布了。

我們手動把 Golang 工具鏈嫁接到 alpine:3.20 上,只為了釘住 libvips 版本。後來才發現,golang:1.25.11-alpine3.22 一直都在 Docker Hub 上——官方早就發布了這個組合,我們只是沒查。

一個官方語言 image 在 Docker Hub 上發布的是一張矩陣(可用版本組合的表格),不是一組固定配對。golang:<go>-alpine<alpine> 的每個交叉點都是一個可選的 tag:

curl -s "https://hub.docker.com/v2/repositories/library/golang/tags?page_size=100&name=alpine3.22" \
  | jq -r '.results[] | "\(.name)  \(.tag_last_pushed[:10])"'
                  3.20      3.21      3.22      3.23      3.24
  go 1.25.11       -         -         yes       yes       yes
  go 1.25.12       -         -         NONE      yes       yes   <- 視窗滑動了
  last built    2025-05   2025-12   2026-06     live      live

tag_last_pushed 是活性信號,不是 tag 存在。 一個日期停在半年前的 tag 代表凍結的分支:它還能拉,但永遠不會再被重建,也就不再收到安全修補(見 EOL base image 讓安全更新靜默失效)。

這張矩陣是一個大約涵蓋 3 個 base release 的滑動視窗。釘住 base 端,最終會凍住語言端,因為尾端會停止被建置。

兩種耦合別混淆:語言 × base 在視窗內是可選的;base × 它的系統函式庫是焊死的——沒有任何 tag 能改變 apk 在某個 release 上給你的東西。

手動拼湊之前先查矩陣。你要的組合通常已經發布了;沒有的時候,那個缺席本身才是 graft 的正當理由。


參考來源:

Related: 回到連鎖反應總覽,或深入了解把 Golang 工具鏈嫁接到你需要的 base image釘版要附退場計畫EOL base image 讓安全更新靜默失效

Tags #devops #debugging #docker
// connect

Be brave | Be wise | Be grateful

21 BreakinCode

// elsewhere
LinkedInMedium (lang: en)Youtube
wh:~$William Hung· © 2026 Taipei · GMT+8 · Available for collaboration