Dockerfile是否需要“FROM”语句?

5
对于我目前接触到的所有Dockerfiles(尽管数量不多),它们都使用了一个FROM子句,以基于现有镜像,即使是FROM scratch。这个子句是必需的吗?有没有可能创建一个没有FROM子句的Dockerfile?这样创建的容器能做什么吗?
编辑
我读到:一个没有FROM指令的Dockerfile没有父镜像,并被称为基础镜像。

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

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


1
当您尝试它时,它会做什么? - Brady Holt
2
我已经提交了一个PR(https://github.com/docker/docker.github.io/pull/9617)来帮助澄清措辞。 - BMitch
3个回答

8
根据官方文档,需要以下操作:

FROM 指令初始化一个新的构建阶段,并为后续的指令设置基础镜像。因此,有效的 Dockerfile 必须FROM 指令开始。镜像可以是任何有效的镜像——从公共仓库拉取镜像尤其容易。

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


我通过谷歌搜索找到了这个页面,但是没有往下滚动足够多的内容... - flow2k
1
发现一个链接似乎措辞错误(请参见上面的编辑)- 你同意吗? - flow2k

6
短答案是是的,FROM子句是必需的。但如果你稍微思考一下镜像构建过程,就会更容易得出这个结论。 Dockerfile只是描述由Docker构建子系统执行的一系列命令的方式,以创建一个镜像。而镜像只是一堆常规文件,尤其是特定Linux发行版的用户空间文件,但可能还有一些额外的文件。每个Docker镜像都基于父镜像,并向父镜像的集合添加自己的文件。每个镜像都必须从某个地方开始,即指定其父镜像。所有父镜像的父母是一个scratch镜像,定义为noop,即一组空文件。 看一下busybox镜像:
FROM scratch
ADD busybox.tar.xz /
CMD ["sh"]

这个过程从零开始,也就是一个空的文件集合,并且会从busybox.tar.xz归档中复制一堆文件到这个文件集合中。

如果你想创建自己的镜像,可以从busybox镜像开始,并描述你将添加哪些文件(以及如何添加):

FROM busybox:latest

ADD myfile.txt /

但每次新的图像都需要从某个地方开始。


3
有点哲学性的观点:从概念上讲,我们也可以想象从零开始构建 - Dockerfile解析器可以写成将缺少FROM视为与FROM scratch相同。这种行为与某些语言中includeimport语句的用法一致,省略这些语句仅意味着没有明确地“引入”任何内容。 - flow2k

1

是的,它定义了您正在构建的镜像基于哪些层。 如果要从头开始创建镜像,则 Docker 提供一个名为 scratch 的镜像。

文档还说:

父镜像是您的镜像所基于的镜像。

而且:

基础镜像在其 Dockerfile 中具有 FROM scratch。

请参阅基础镜像文档


好的,谢谢 - 我刚看到一个链接似乎有误(在上面的编辑中)- 你同意吗? - flow2k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接