在Dockerfile中清空多阶段构建

时间:2018-11-29 19:24:04

标签: docker docker-multi-stage-build

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

# 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

1 个答案:

答案 0 :(得分:1)

写Dockerfile的人可能不了解多阶段构建的工作方式。这不是一个罕见的误解,因为Dockerfile的一个常见要求是将多个映像合并在一起,而这并不是多个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存储库上填写一个问题来修复其示例。