FROM指令使新镜像复用基础镜像的只读层而非复制,各层按内容哈希存储且可被多镜像共享;多阶段构建中相同基础镜像的层仅加载一次;层复用取决于内容哈希而非tag名称。

FROM 指令本身不复制镜像层,而是让新构建的镜像“指向”基础镜像已有的只读层,实现层级复用。
镜像层是只读的,且可被多个镜像共享
Docker 镜像由一系列有序的只读层(layer)组成,每层对应一条 Dockerfile 指令(如 RUN、COPY)。这些层在磁盘上以内容寻址方式存储(通过 SHA256 摘要标识),相同内容的层只会存一份。当多个镜像使用同一个基础镜像(例如 FROM ubuntu:22.04),它们都引用 ubuntu:22.04 镜像的全部只读层,不额外拷贝数据。
构建时的 layer cache 依赖 FROM 层的完整性
如果本地已有 ubuntu:22.04 的所有层,Docker 构建器会跳过拉取,并直接复用其层作为新镜像的底层。后续指令(如 RUN apt update)是否命中缓存,取决于该层是否已在本地存在且未被修改。一旦 FROM 镜像更新(比如远程仓库中 ubuntu:22.04 被重新推送),本地旧层仍可用,但新构建默认不会自动拉取——除非显式执行 docker build --pull 或本地不存在该标签。
多阶段构建中,不同 stage 可复用同一基础层
即使多个 stage 使用相同 FROM(如两个 stage 都写 FROM golang:1.22),Docker 仍只加载一次 golang:1.22 的所有只读层到本地存储。各 stage 在其之上叠加自己的层,互不影响,但底层共享。这显著减少磁盘占用和拉取时间。
注意 tag 不等于不可变层,复用的前提是层 ID 一致
ubuntu:latest 和 ubuntu:22.04 可能指向不同镜像,哪怕内容相似,只要某一层的构建上下文或指令结果不同,生成的层 ID 就不同,就无法复用。真正决定能否复用的是层的 content hash,不是 tag 名称。所以固定 tag(如 ubuntu:22.04.4)比 latest 更利于稳定复用。










