Docker 的口号是 Build, Ship, and Run Any App, Anywhere.但是我们在应用过程中会遇到一个问题,我们在 build 的时候,把源码也 build 进去了。然后就继续把源码 Ship 出去吗?这可不行。所有的编译型语言都面临这个困扰。即使是脚本型语言,build 的时候也会使用很多上线时用不到的构建工具,而我们希望减小生产镜像的体积,这样我们的小鲸鱼才能多拉一点集装箱嘛。传统做法我们最终的目的是要将编译好的可执行文件复制到alpine这样的迷你镜像里,那么该怎么弄到编译好的文件呢?基于 Docker 的思想,我们肯定需要在一个标准容器中编译,这样这个过程才是标准化的,再说,你在 Ubuntu 编译出一个二进制文件在 alpine 也运行不了。于是我们先需要准备一个编译用的自定义镜像。一般是用相应语言的 alpine 基础镜像,把编译项目额外需要的各种工具打包进去,比如 golang 目前没有官方的包管理,你就需要把你用的包管理工具装进去。然后我们需要在运行 container 时把主机的一个目录通过 -v 挂载到 container上,让它把编译的结果输出到这个挂载的目录,这样我们就在主机上拿到这个文件了。最后,我们用一个最小的alpine镜像,把二进制文件复制进去。可能你还需要设置一下时区之类的。持续集成上面的流程,在用持续集成工具时又变成
...
继续阅读
(8)