CircleCI共享Docker镜像的多作业场景下如何优化提速?
可落地的CircleCI流程优化方案
以下是优先级从高到低的优化手段,都可以直接在你现有配置上修改落地:
- 压缩镜像存档,减少传输和加载耗时
你当前直接docker save输出的是未压缩的tar包,体积非常大,既拖慢persist_to_workspace/attach_workspace的文件传输速度,也会拉长docker load的读取时间。可以直接在打包时加压缩:
在build_container作业的Save Docker Image步骤改为:
下游作业加载时改为:docker save ${CIRCLE_PROJECT_REPONAME}:${CIRCLE_SHA1} | gzip > workspace/${CIRCLE_SHA1}.tar.gz
对压缩速度要求更高的话可以换成zstd压缩,比gzip快3~5倍,压缩率也更高。gunzip -c workspace/${CIRCLE_SHA1}.tar.gz | docker load - 用容器注册表替代workspace传递镜像
走workspace传tar包的流程本身就有多余的序列化、反序列化开销,更推荐你在build_container作业构建完镜像后,直接推到容器注册表(可以用CircleCI免费的内置注册表、Docker Hub、云厂商ECR等),下游作业直接docker pull拉取镜像即可,省去save、persist、attach、load全流程的冗余开销,还可以复用Docker Layer Caching的缓存层,后续跑流水线时拉取速度会更快。 - 删掉冗余步骤
你当前run_script_inside_container和scan_container作业里的checkout步骤完全不需要,这两个作业不需要拉取代码,只需要用到构建好的镜像,删掉checkout可以省几秒到几十秒的代码拉取时间。另外看你当前的scan_container作业甚至没有加载镜像的步骤,相当于你的镜像扫描根本没扫到你刚构建的镜像,属于配置错误,记得补上镜像拉取/加载的逻辑。 - 优化镜像本身的体积
你当前的基础镜像就有500MB,可以考虑换成更小的基础镜像(比如同版本的alpine变体镜像),或者用Docker多阶段构建,把最终镜像里不需要的编译依赖、构建缓存都删掉,尽可能减小镜像体积,传输和加载速度自然会提升。 - 调整执行器减少Remote Docker开销
你当前用的是Docker执行器加setup_remote_docker的模式,本身有远程Docker实例的启动和通信开销,如果对性能要求更高,可以换成CircleCI的machine执行器,Docker直接运行在本地虚拟机里,不需要走远程调用,镜像加载、运行的速度都会更快。
内容的提问来源于stack exchange,提问作者rustyMagnet
相关产品推荐
相关产品推荐

