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 讓安全更新靜默失效。