GitLab CI中如何无需推送镜像到仓库实现Job间镜像传递?
可行,这几种方案能实现
1. 导出镜像为tar包,通过CI工件传递
- job1构建镜像后,用
docker save把镜像导出成tar文件:docker build -t my-app-image . docker save -o my-app-image.tar my-app-image - 在CI配置里把这个tar文件设为工件(artifacts),让后续job能自动下载
- 后续job中用
docker load导入镜像就能直接用:docker load -i my-app-image.tar # 比如直接运行容器:docker run my-app-image
2. 复用同runner的本地Docker镜像(仅限固定runner场景)
如果所有job都跑在同一个CI runner上,不用额外操作:
- job1构建的镜像会存在runner本地的Docker daemon里
- 后续job只要在这个runner上执行,就能直接调用该镜像
- 注意:如果是动态生成的runner(比如K8s Pod runner),这种方法不生效
3. 利用CI自带的镜像层缓存(部分CI支持)
像GitLab CI、GitHub Actions这类工具,支持直接缓存Docker镜像层:
- job1构建时配置缓存规则,把镜像层缓存起来
- 后续job构建时会复用已缓存的层,相当于跳过重复构建步骤,达到类似复用镜像的效果
注意事项
- 用tar包传递会占用存储和传输时间,镜像越大影响越明显,要留意CI系统的工件大小限制
- 共享runner场景下,不要依赖方式2,因为runner可能被重置或分配给其他任务
- 确保CI job有足够权限操作Docker daemon,部分环境需要额外配置权限
内容的提问来源于stack exchange,提问作者braythe
相关产品推荐
相关产品推荐

