Dockerfile 中的空多阶段构建

Empty multi-stage build in a Dockerfile

我明白使用多阶段构建的目的,但我不明白你为什么想要一个这样的阶段?有人可以详细说明用例吗?

# Use an official Ubuntu 18.04 as parent image
FROM ubuntu:18.04

# Install python 2.7
FROM python:2.7

RUN apt-get update
RUN apt-get install -y git make g++
# more stuff, nothing using layer 0.

来源:https://raw.githubusercontent.com/kubeflow/examples/master/xgboost_ames_housing/Dockerfile

编写 Dockerfile 的人可能不了解多阶段构建的工作原理。这不是一个不寻常的误解,因为 Dockerfiles 的一个常见请求是将多个图像合并在一起,而这不是多个 FROM 行提供的。

该示例所做的是下载图像,然后立即忽略它。如果在后期有一个 COPY 命令,就可以从以前的图像复制,这是我看到的导入图像而不对它做任何事情的少数原因之一:

ARG parent_ver=2.0
FROM repo:5000/parent:${parent_ver} as parent
FROM base as release
COPY --from=parent /some/file /dest
...

一般情况下你可以直接从另一个图像复制,但是如果你想像上面那样用一个变量来指定它,目前的解决方案就是上面的解决方法。

由于所提供的示例完成了 none 的操作,您将看到的只是一个已下载且未使用的不需要的图像。这会减慢构建速度、占用带宽并占用磁盘 space,但仅限于构建服务器。值得在 GitHub 回购上填写一个问题来修复他们的例子。