共计 962 个字符,预计需要花费 3 分钟才能阅读完成。
原文
Image tag 是不稳定的
Docker image 的 tag 是不稳定的,这句话的意思是就算 tag 不变,其所代表的 image 并非一成不变,例如 openjdk:8 在去年代表 jdk 8u161 今年则代表 jdk 8u191。就算你使用 openjdk:8u181 也不能保证这个 image 是不变的,为什么这么说?
一个 Docker image 大致是由 4 部分组成的:
其依赖的基础镜像,由 Dockerfile 的 FROM 指令所指定
其所包含的软件,在这个例子里就是 openjdk 8u181
Dockerfile 的其他脚本
启动入口,比如 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。记得确保 docker build 添加了 –pull 选项。
对于 snapshot 版,你应该将构建 image 的过程融入到软件的构建过程中。以 Maven 为例,使用 spotify-dockerfile-plugin,mvn clean install dockerfile:build dockerfile:push。
不论是 stable 版还是 snapshot 版,都应该利用 CI/CD 工具(如 Jenkins)将 image 构建工作自动化。