创建基础镜像

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

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

  • 基础镜像包含 在FROM scratch其 Dockerfile 中。

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

使用 tar 创建完整图像

一般来说,从运行您想要打包为父映像的发行版的工作机器开始,尽管 Debian 的Debootstrap等工具不需要这样做 ,您也可以使用它来构建 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 存储库中有更多用于创建父映像的示例脚本 。

使用scratch创建一个简单的父镜像

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

虽然scratch出现在集线器上的 Docker 存储库中,但您无法拉取它、运行它或使用名称标记任何图像scratch。相反,您可以在您的Dockerfile.例如,要使用以下命令创建最小容器 scratch

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

假设您使用https://github.com/docker-library/hello-worldhello上的源代码构建了可执行示例 ,并使用该标志对其进行了编译,则可以使用以下命令构建此 Docker 映像:-staticdocker build

$ docker build --tag hello .

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

笔记

由于适用于 Mac 的 Docker Desktop 和适用于 Windows 的 Docker Desktop 使用 Linux VM,因此您需要 Linux 二进制文件,而不是 Mac 或 Windows 二进制文件。您可以使用 Docker 容器来构建它:

$ docker run --rm -it -v $PWD:/build ubuntu:20.04

container# apt-get update && apt-get install build-essential
container# cd /build
container# gcc -o hello -static hello.c

要运行新映像,请使用以下docker run命令:

$ docker run --rm hello

此示例创建教程中使用的 hello-world 图像。如果您想测试它,可以克隆 图像存储库

更多资源

有很多资源可帮助您编写Dockerfile.

  • 参考部分提供了 所有可用说明的完整指南。Dockerfile
  • 为了帮助您编写清晰、可读、可维护的文件Dockerfile,我们还编写了 Dockerfile 最佳实践指南
  • 如果您的目标是创建新的 Docker 官方镜像,请阅读 Docker 官方镜像