Dockerfile 中是否需要`FROM` 子句?

flo*_*w2k 2 docker dockerfile

对于我遇到的所有 Dockerfiles(当然不是很多),它们都使用了一个FROM子句来建立一个现有的镜像,即使它是FROM scratch.

这个条款是必须的吗?是否可以有一个没有FROM子句的 Dockerfile ?这样创建的容器是否能够做任何事情?

编辑
我读过

没有 FROM 指令的 Dockerfile 没有父镜像,称为基础镜像。

https://docs.docker.com/glossary/?term=parent%20image

但我认为这可能是一个错误。

Iva*_*hko 7

简短的回答是肯定的,FROM 子句是必需的。但如果您稍微考虑一下图像构建过程,就更容易得出这个结论。

Dockerfile 只是描述 Docker 构建子系统创建映像时要执行的一系列命令的一种方式。镜像只是一堆常规文件,最值得注意的是特定 Linux 发行版的用户空间文件,但上面可能还有一些额外的文件。每个 Docker 镜像都基于父镜像,并将自己的文件添加到父镜像集中。每个图像都必须从某些东西开始,即指定其父图像。所有父项的父项是一个scratch定义为 的图像noop,即一组空文件。

看一下busybox图像:

FROM scratch
ADD busybox.tar.xz /
CMD ["sh"]
Run Code Online (Sandbox Code Playgroud)

它从头开始,即一组空文件,并向该组添加(即复制)来自存档的一堆文件busybox.tar.xz

现在,如果您想创建自己的图像,您可以从busybox图像开始并描述要添加哪些文件(以及如何添加):

FROM busybox:latest

ADD myfile.txt /
Run Code Online (Sandbox Code Playgroud)

但每次新的图像都必须从某些东西开始。

  • 一个有点哲学的观点:从概念上讲,我们也可以想象从零开始并构建 - Dockerfile 解析器可以编写为将缺少“FROM”的意思与“从头开始”相同。此行为与某些语言中“include”和“import”语句的使用一致,其中省略这些语句仅意味着没有显式“引入”任何内容。 (4认同)

Mar*_*iba 6

根据官方文档,它需要:

FROM指令初始化一个新的构建阶段,并设置基本映像用于随后的指令。因此,有效的 Dockerfile必须FROM指令开头。镜像可以是任何有效的镜像——从公共存储库中提取镜像特别容易。

https://docs.docker.com/engine/reference/builder/#from