Springhead

Je voudrais mourir pendant mon sommeil.

0%

记录一个无法构建镜像的坑

在和甲方进行技术转移时遇到的一个坑,在我本地构建镜像完全没有问题,但是甲方那边各种报错。其中经历了无数的坑,但是记录一下一个最坑的。

使用相同仓库相同Dockerfile在甲方的机子上构建报了下面这个错,原本以为是甲方内部网络镜像源的问题,但是细问以后发现甲方的电脑能连外网。

1
Error parsing reference: "node:10.15.1 as build" is not a valid repository/tag: invalid reference format

迷幻的是,问了公司的后端小哥,他们后端的镜像之前在甲方机器上是正常构建的。而且甲方机器上也能正常pull这个node:10.15.1的镜像。遂开始研究起我们前端的Dockerfile到底有什么魔力能让甲方的电脑就是构建不成功。

反正最后搜来搜去发现了一个stack overflow上的提问,Dockerfile is not a valid repository/tag: invalid reference format

结论是前端的Dockerfile使用了multi-stage builds(多阶段构建),而这个特性是在docker的17.06版本引入的。而我本地的docker是20多,绰绰有余。于是赶紧问甲方机器docker版本,说实话我本来以为也就是低了一两个版本,万万没想到甲方的机器居然是1.13.1啊!!!多么古老的版本!反正最后升了一下级就可以正常build了。

都写到这了,主要是顺带学习一下这个多阶段构建,之前的Dockerfile基本都是cv之前其他项目的,只学习了里面的命令,没有注意到这个多阶段构建。感觉别人总结的挺好的就不想重新写一遍了,指路:Dockerfile的多阶段构建(multi-stage builds)。当然英语好的也可以直接看上面那个官方文档。

对于前端来说在构建时使用了node,但实际运行起来也就是一堆静态的js文件,很适合用多阶段构建来减少镜像体积。我感觉只要是有编译并且运行时不依赖编译环境的情况好像都挺适合多阶段构建的,是一个用来拯救动辄打一个g镜像的好办法。但我们后端用的python啊