我有一个相当大的Dockerfile,它有多个层。其中一些层需要相当长的时间。我注意到很多事情并不相互依赖。
因此,**显而易见的问题是:**我可以并行docker build
吗?
docker build似乎只有限制构建速度的选项,而不是加速构建速度(eidogg. --memory
)。
例如:假设你有一个Dockerfile
,看起来像这样,我现在想调用一个docker build --some-flag
,它并行地构建所有的阶段,除非它们必须互相工作。
FROM someImage AS stage1
# do some task
FROM otherImage AS stage2
# do another taks
FROM yetAnotherImg As stage3
# more work
COPY --from=stage2 ... # stage3 has to wait for stage2 to finish
你知道--some-flag
是否存在吗?你知道如何实现这个目标的不同方法吗?
- 编辑:**
我唯一能想到的是将Dockerfile分割成更多的阶段,从而减少修改的痛苦,但这并不是一个理想的解决方案
2条答案
按热度按时间hyrbngr71#
感谢m303945的回答!
这个答案为您提供了一个如何并行构建的示例:
顺序:
docker build .
大约需要30秒。并行:
DOCKER_BUILDKIT=1 docker build .
大约需要10秒。码头工文件
amazing blog post
eaf3rand2#
如果BuildKit发现一个阶段依赖于其他不相互依赖的阶段,那么它将并行运行这些阶段(无论如何,假设有足够的线程/CPU可用)。
如果您使用
docker build .
构建这个代码(它隐式地构建Dockerfile中的最后一个阶段),则s1
、s2
和s3
阶段将自动并行运行(同样,假设您有系统资源,但这是在我的相当旧的计算机上发生的)。......如果我们运行图像,我们可以看到各个阶段确实是同时运行的:
为了回答您的问题,您可以将
stage3
分为两个阶段,其中一个阶段执行实际工作,另一个阶段只是从其他阶段复制内容: