创建基础镜像


大多数 Dockerfile 从父镜像开始。如果你需要完全控制镜像的内容,则可能需要创建一个基础镜像。区别如下:

  • 父镜像是你的镜像所基于的镜像。 它指的是 DockerfileFROM 指令的内容。Dockerfile 中的每个后续声明都会修改此父镜像。 大多数 Dockerfile 从父镜像开始,而不是从基础镜像开始。然而,这些术语有时可以互换使用。
  • 基础镜像Dockerfile 中有FROM scratch

本文向你展示了创建基础镜像的几种方法。具体过程很大程度上取决于你要打包的 Linux 发行版。我们在下面提供了一些示例,我们鼓励你提交拉取请求以贡献新的请求。

一般来说,从运行你想要打包为父镜像的发行版的工作机器开始,尽管 DebianDebootstrap 等工具不需要这样做,你也可以使用它来构建 Ubuntu 镜像。

创建 Ubuntu 父镜像就像下面这样简单:

$ sudo debootstrap focal focal > /dev/null
$ sudo tar -C focal -c . | docker import - focal

sha256:81ec9a55a92a5618161f68ae691d092bf14d700129093158297b3d01593f4ee3

$ docker run focal cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS"

Docker GitHub 存储库 中有更多用于创建父镜像的示例脚本。

你可以使用Docker保留的最小镜像、scratch作为构建容器的起点。使用scratch镜像向构建过程发出信号, 表明你希望 Dockerfile中的下一个命令成为镜像中的第一个文件系统层。

虽然scratch出现在Hub上的Docker存储库中,但你无法拉取它、运行它或使用名称scratch标记任何镜像。 相反,你可以在Dockerfile中引用它。例如,要使用scratch创建一个最小容器:

# syntax=docker/dockerfile:1
FROM scratch
ADD hello /
CMD ["/hello"]

假设你使用 https://github.com/docker-library/hello-world 上的源代码构建了 “hello” 可执行示例, 并使用--static标志对其进行了编译,则可以使用此docker build命令构建镜像:

docker build --tag hello .

不要忘记末尾的.字符,它将构建上下文设置为当前目录。

使用 docker run 运行你的新镜像

$ docker run --rm hello

此示例创建教程中使用的 hello-world 镜像。如果你想测试一下,可以从镜像库里克隆。

有很多资源可帮助你编写Dockerfile