稳定与非稳定版本软件的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

相关文章
相关标签/搜索