穩定與非穩定版本軟件的Docker Image構建策略

原文html

Image tag是不穩定的

Docker image的tag是不穩定的,這句話的意思是就算tag不變,其所表明的image並不是一成不變,例如openjdk:8在去年表明jdk 8u161今年則表明jdk 8u191。就算你使用openjdk:8u181也不能保證這個image是不變的,爲何這麼說?git

一個Docker image大體是由4部分組成的:程序員

  1. 其依賴的基礎鏡像,由Dockerfile的FROM指令所指定
  2. 其所包含的軟件,在這個例子裏就是 openjdk 8u181
  3. Dockerfile的其餘腳本
  4. 啓動入口,好比docker-entrypoint.sh

就算軟件不發生變化,另外3個也是有可能發生變化的,而構建的新image的tag依然是openjdk:8u181。並且要注意到通常採用的是軟件的版本號做爲tag,而不是commit、構建日期做爲tag。若是你是Java程序員,能夠類比docker image tag爲maven的SNAPSHOTgithub

那這意味着什麼?docker

  • 從docker image使用方角度,每次啓動以前都須要pull一下,確保使用了新的image
  • 從docker image提供方角度,就算你的軟件版本已經凍結,你仍然須要按期構建image併發布倉庫上

針對穩定與非穩定版本的構建策略

和Maven的版本定義同樣,你的軟件應該分爲兩種:apache

  • stable版,即一旦發佈其版本號對應的代碼不會再作修改
  • snapshot版,又稱nightly-build版,即該版本號對應的代碼是不穩定的

對於stable版,你應該按期對其構建image。好比你有版本1.0、1.一、1.2,那你應該按期從軟件倉庫中下載這三個版本的構建物,而後對爲它們構建image。以Maven舉例,按期從Maven倉庫下載它們的Jar,而後爲它們構建image。記得確保docker build添加了--pull選項。併發

對於snapshot版,你應該將構建image的過程融入到軟件的構建過程當中。以Maven爲例,使用spotify-dockerfile-pluginmvn clean install dockerfile:build dockerfile:pushmaven

不管是stable版仍是snapshot版,都應該利用CI/CD工具(如Jenkins)將image構建工做自動化。ide

相關文章
相關標籤/搜索