scratch
是一个特殊的 Docker 镜像,它是空的,不包含任何文件或文件系统。
当你使用 FROM scratch
作为 Dockerfile 的起始行时,意味着你打算创建一个非常精简的镜像,不基于任何已有的操作系统或者其他基础镜像。这种方式通常用于创建非常小的、只包含你的应用程序和它所需的最小依赖的 Docker 镜像。例如,静态编译的 Go 语言应用就经常使用这种方式来创建 Docker 镜像,因为静态编译的 Go 应用已经包含了运行程序所需的所有代码,不需要任何额外的操作系统功能。
然而,这种方式创建的 Docker 镜像,由于缺乏任何预先存在的文件系统或工具,可能会在某些情况下难以使用。例如,FROM scratch
的镜像中不会包含任何 shell(比如 sh
或 bash
),也不会包含诸如 ls
、cat
等常用工具。这可能导致排查问题或者运行一些常规任务变得困难。
注:如果想要在 docker-compose.yml 中挂载新的卷并覆盖 entrypoint,基于 scratch 构建镜像会报错找不到挂载的文件。解决办法是临时替换成 ubuntu 镜像,发布时再换回 scratch。
使用方式:在第二阶段基于 scratch
镜像构建,只包含编译好的应用程序和一些最小的运行时依赖,以保持最终 Docker 镜像的精简。