穩定與非穩定版本軟體的Docker Image構建策略
Image tag是不穩定的
Docker image的tag是不穩定的,這句話的意思是就算tag不變,其所代表的image並非一成不變
,例如openjdk:8
在去年代表jdk 8u161今年則代表jdk 8u191。就算你使用openjdk:8u181
也不能保證這個image是不變的,為什麼這麼說?
一個Docker image大致是由4部分組成的:
FROM docker-entrypoint.sh
就算軟體不發生變化,另外3個也是有可能發生變化的,而構建的新image的tag依然是openjdk:8u181
。而且要注意到一般採用的是軟體的版本號作為tag,而不是commit、構建日期作為tag。如果你是Java程式設計師,可以類比docker image tag為maven的SNAPSHOT
。
那這意味著什麼?
- 從docker image使用方角度,每次啟動之前都需要pull一下,確保使用了新的image
- 從docker image提供方角度,就算你的軟體版本已經凍結,你仍然需要定期構建image併發布倉庫上
針對穩定與非穩定版本的構建策略
和Maven的版本定義一樣,你的軟體應該分為兩種:
- stable版,即一旦釋出其版本號對應的程式碼不會再做修改
- snapshot版,又稱nightly-build版,即該版本號對應的程式碼是不穩定的
對於stable版,你應該定期對其構建image。比如你有版本1.0、1.1、1.2,那你應該定期從軟體倉庫中下載這三個版本的構建物,然後對為它們構建image。以Maven舉例,定期從Maven倉庫下載它們的Jar,然後為它們構建image。
對於snapshot版,你應該將構建image的過程融入到軟體的構建過程中。以Maven為例,使用spotify-dockerfile-plugin
,mvn clean install dockerfile:build dockerfile:push
。
不論是stable版還是snapshot版,都應該利用CI/CD工具(如Jenkins)將image構建工作自動化。