【问题标题】:Docker Multi-Stage: How to split up into multiple DockerfilesDocker Multi-Stage:如何拆分成多个 Dockerfile
【发布时间】:2018-12-06 21:32:52
【问题描述】:

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

是否可以将这个庞大的 Dockerfile 拆分为多个文件?

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

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

【问题讨论】:

  • 在这方面我绝对是菜鸟。另外,我觉得这是一个重复的问题——但我找不到任何相关的东西。

标签: docker docker-multi-stage-build


【解决方案1】:

如果你的 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

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

docker build -f Dockerfile.builder -t me/builder .

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

FROM me/builder AS builder
FROM alpine:3.8
COPY --from=builder /out/ /
CMD the_app

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

【讨论】:

  • 这只是构建器模式,对吧?在我的编辑中,我已经解决了这个选项。你知道任何替代方案吗?有没有IMPORT Dockerfile.builder这样的东西
  • 不是本地的。原则上,您可以使用其他一些模板工具,例如 m4,它具有某种 include 调用来生成 Dockerfile。
  • 根据the docs:“当使用多阶段构建时,您不仅限于从之前在 Dockerfile 中创建的阶段进行复制。您可以使用 COPY --from 指令从单独的镜像,使用本地镜像名称、本地或 Docker 注册表上可用的标签或标签 ID"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 2015-02-09
相关资源
最近更新 更多