其他
构建制品不一致,后续工作都是白费
如何保证软件交付过程的标准化
容器镜像常见问题及实践建议
把所有的东西都装到一个容器里面,把容器当虚拟机来用。
把ENTRYPOINT设置为systemd:systemd管理的进程运行的结果和状态和的容器状态是不一致的,有可能里面的进程已经僵死了,或者Crash了,但是systemd还活着,从外部看起来这个容器没问题。
私有化部署的时候带一堆导出的镜像tar包。tar包是不分层的,它不知道里面是有很多层。
每次把基础镜像下发到整个集群,导致网络变得特别拥堵
尽量采用轻量的基础镜像和确定的镜像版本。
通过分层来复用镜像内容,避免重复拉取。
避免采用systemd,包括supervisord和类似这样的daemon管理服务来做ENTRYPOINT。
采用本地的dockerregistry等以层为粒度来离线拷贝镜像。
避免同时要做大量的pull,可采用P2P的方式(如使用dragonfly)提升镜像分发效率。
如何保证软件制品的一致性
相同的代码
相同的构建环境
相同的构建脚本
如何提升构建效率
应用瘦身:检查应用的依赖情况,应用包体积是否过大,依赖项是否过多,能否去除不必要的依赖,能否构建更小的镜像。
分层构建:底层的东西先构建出来以后被上层所复用,然后就可以做增量式的了。
构建缓存:构建过程中拉取依赖是很耗时的,要避免重复拉取。
网络优化:主要是保证代码、构建机器和制品库之间的低网络延时。代码和构建机器是否是在同一个低时延链路中。例如代码在Github上而使用云效构建,此时的延时相对于内网会高出许多。
仓库镜像:仓库镜像可以极大地减少拉取依赖项的时间。在国内的网络环境下,如果从源仓库获取依赖,可能延时会非常长,这时可以使用镜像网络降低延时。例如nodejs开发者常使用淘宝的npm镜像源,而Python开发者使用清华的镜像源。对于企业来说也可以构建自己的镜像仓库以提升可靠性与降低延时。云效也使用了镜像仓库,来减少拉取的时间。