我司的自动化构建系统现在使用 docker build 。项目根目录下放一个 Dockerfile 就行。
但 docker build 有一些限制,比如无法挂载 volume,maven 的包不太能完美缓存。每次构建都要下载一部分,构建时间 2 分钟。我测试过,如果 maven 包完美缓存,构建时间 1 分钟。
所以我在想是否要提供 docker run 的构建方式 。项目根目录下放一个 buildspec.yml ,在其中指定 runtime (也是 docker 镜像),代码挂载点,卷挂载点,构建指令等等。然后自动化系统会 run 这个 runtime 镜像,将代码复制到指定位置,将卷挂载至指定位置,并执行构建指令。构建指令会在 runtime container 中调用 docker build 生成一个镜像。
但是我觉得这么做不是很优雅,有以下几个问题:
- Dockerfile 仅依赖 Docker,因此容易调试; buildspec.yml 依赖自动化构建系统,出了问题得在自动化构建系统和配置文件中来回查找。
- 大大增加自动化系统本身的复杂度,以及 buildspec.yml 会很复杂,难以交给其他人维护
- 除了节省一些构建时间之外,看不到明显优势
- 日后和其他第三方自动化系统结合可能会有问题,毕竟所有第三方构建肯定支持 docker build,而想要在第三方系统里执行 docker run 外加挂载卷外加 run 的这个 container 内还要能执行 docker build 不一定能成。