1

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

# 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

4

1 回答 1

1

编写 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
...

通常你可以直接从另一个图像复制,但如果你想用上面的变量指定它,当前的解决方案涉及上述解决方法。

由于提供的示例没有做任何事情,您将看到的只是下载且未使用的不需要的图像。这会减慢构建速度、占用带宽并占用磁盘空间,但仅限于构建服务器上。值得在 GitHub 存储库上填写一个问题来修复他们的示例。

于 2018-11-30T00:08:09.907 回答