系統用一組「機器指紋」認出「這是哪一台機器」,用途有兩個:①解鎖憑證綁定(原廠簽的解鎖檔只對這台有效)②授權綁機(license 綁客戶那台機器)。
問題:這個指紋在容器裡每次重啟就變一個,等於同一台機器每次開機都換一張臉。後果:
common/license/machine_fingerprint.py 的指紋來源優先序:
/etc/machine-id(穩定,設計主判準)/var/lib/dbus/machine-id(備援)uuid.getnode()(MAC 位址,restart 會變,原碼註解只當「本地測試備援」)實測(188 正式 guidant-api 容器):
/etc/machine-id = 存在但 0 bytes 空檔(Debian/Ubuntu base image 標準行為:build 時留空佔位,預期 runtime 由 systemd 填,但容器不跑 systemd → 永遠空)/var/lib/dbus/machine-id = 不存在_read_machine_id() 對空檔回 None(if value: 空字串為 False)→ 退回第 3 級 MAC32:6e:d4:45:04:e6),docker restart 就換一個/etc/machine-id = d478e208...(穩定存在) ← 修法的錨點原碼 docstring 自己寫「正式部署預期跑在有 /etc/machine-id 的容器宿主上」——設計意圖對,但沒把宿主的 machine-id 帶進容器,實際落在第 3 級。
- /etc/machine-id:/etc/machine-id:ro,容器指紋跟宿主機穩定綁定。最貼近「綁這台實體機」原意,改動最小。風險:宿主若無 machine-id(極少數精簡系統)要 fallback。