Docker Multi-Stage:如何拆分为多个Dockerfile

Una*_*dra 6 docker docker-multi-stage-build

我已成功使用Docker的Multi-Stage功能构建了一些代码,然后将生成的工件复制到最终映像中。

可以将这个大型Dockerfile拆分为多个文件吗?

我想提高各个阶段的可读性。当添加更多阶段时,这将变得更加重要。

编辑:我知道我可以编写一个Makefile(或类似文件),在该文件中首先构建一个名为“ myproject-stage1”的映像,然后使用FROM myproject-stage1 AS build。但是,如果可能,我宁愿避免使用外部构建工具。

Dav*_*aze 6

如果您的 Dockerfile 当前看起来像:

FROM ubuntu:16.04 AS builder
RUN apt-get install build-essential
COPY . ./
RUN ./build_all_the_things \
 && make install PREFIX=/usr DESTDIR/out

FROM alpine:3.8
COPY --from=builder /out/ /
CMD the_app
Run Code Online (Sandbox Code Playgroud)

您可以轻松地按原样将第一部分拆分为自己的 Dockerfile,然后构建它

docker build -f Dockerfile.builder -t me/builder .
Run Code Online (Sandbox Code Playgroud)

COPY --from必须在您的 Dockerfile 中命名某个前一阶段,但该阶段不需要做太多事情;然后您可以将其后半部分更改为

FROM me/builder AS builder
FROM alpine:3.8
COPY --from=builder /out/ /
CMD the_app
Run Code Online (Sandbox Code Playgroud)

这样做的最大缺点是您需要两个单独的docker build命令来实际构建最终映像。您可以编写一个 shell 脚本来同时执行它们。

  • 根据[文档](https://docs.docker.com/develop/develop-images/multistage-build/#use-an-external-image-as-a-stage):“当使用多阶段构建时, 您不限于从之前在 Dockerfile 中创建的阶段进行复制。您可以使用 COPY --from 指令从单独的映像进行复制,可以使用本地映像名称、本地或 Docker 注册表上可用的标签,或者标签 ID” (4认同)