Docker Hub 根据 GitHub Tags 自动构建带版本号镜像

请注意,本文编写于 339 天前,最后修改于 339 天前,其中某些信息可能已经过时。

自从去年买了一个蜗牛矿渣当作 NAS 开始,我就在折腾 NAS 这条路上越走越远。在 NAS上折腾软件和服务最方便的就是通过 docker 部署。所以能找到 docker 镜像的软件,我绝对不会自己折腾安装过程。当然有些时候没有办法找到现成的 docker 镜像,那就自己动手构建镜像。

众所周知,我们可以通过 Docker Hub 的自动化构建存放在 GitHub 上某个 branch 的代码。每当我们 git push 代码到 GitHub 就会触发一次 Docker Hub 构建一个新版本。

但是我最近发现一个问题,就是每次构建出来的镜像都是 latest 版本,没有留下历史版本的镜像,这就很不方便。比如我新构建的镜像有问题,但是没办法立刻回退到上一个版本的镜像,除非我把代码改回去再构建一次,这事儿听起来就很不科学。

当然 Docker Hub 也可以根据 GitHub 的特定 Tag 来自动构建镜像。难道我每次在 GitHub 创建一个新的 Tag 都要在 Docker Hub 上创建一条新的构建规则吗?这事儿听起来也挺蠢的。

有没有办法当我在 GitHub 创建一个任意版本号的 Tag 的时候,Docker Hub 这边都自动根据这个 Tag 的版本号,自动构建一个对应版本号的镜像呢?答案当然是有的,Docker Hub 的自动构建规则支持表达式匹配 Tag。

我们可以新增一条如下的自动构建规则:

Source TypeSourceDocker Tag
Tag/^v([0-9]+).([0-9]+).([0-9]+)$/{1}.{2}.{3}

然后当我们在 GitHub 创建一个 v0.1.1 的 Tag 之后, Docker Hub 会自动构建一个版本号为 0.1.1 的镜像。

这样我们自己构建的镜像库也能跟 MySQL 这种知名软件的镜像库一样,有一串各种版本号的镜像可用。当新版本的镜像出现的某些问题的时候,我们可以随时退回旧的镜像先用着,这下感觉舒服多了。

参考资料