创建基础图像

预计阅读时间:3分钟

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

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

  • 基本图像具有FROM scratch在其Dockerfile。

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

使用tar创建完整图像

通常,从一台运行您要打包为父映像打包的发行版的工作机器开始,尽管对于某些工具(例如Debian的Debootstrap)不是必需的,您也可以使用这些工具 来构建Ubuntu映像。

创建Ubuntu父映像可以很简单:

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

a29c15f1bf7a

$ docker run xenial cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"

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

从头开始创建简单的父图像

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

尽管它scratch出现在集线器上Docker的存储库中,但您无法将其拉出,运行或使用name标记任何图像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映像:

docker build --tag hello .

不要忘了.最后的字符,该字符将构建上下文设置为当前目录。

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

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

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

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

docker run --rm hello

本示例创建了教程中使用的hello-world图像。如果要对其进行测试,则可以克隆 image repo

更多资源

有很多资源可以帮助您编写自己的文章Dockerfile

图像基本图像实例