创建基本映像(引擎) | Create a base image (Engine)
大多数Dockerfiles从父映像开始。如果您需要完全控制图像的内容,则可能需要创建基本图像。以下是区别:
- 一个父映像是你的形象是基于图像。它
FROM
指向Dockerfile中指令的内容。Dockerfile中的每个后续声明都会修改此父图像。大多数Dockerfiles从父映像开始,而不是基本映像。但是,这些术语有时可以互换使用。
- 一个基本图像要么不具有
FROM
线在其Dockerfile,或具有FROM scratch
。
本主题向您展示了创建基础图像的几种方法。具体的过程将在很大程度上取决于你想打包的 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 Repo 中有更多用于创建父图像的示例脚本:
- 在Debian / Ubuntu 或 CentOS / RHEL / SLC /等上的 CentOS / Scientific Linux CERN(SLC)。
使用scratch创建一个简单的父图像
您可以使用 Docker 的保留最小图像scratch
作为构建容器的起点。使用scratch
“图像”信号构建过程,您希望其中的下一个命令Dockerfile
成为图像中的第一个文件系统层。
当scratch
出现在集线器上的 Docker 存储库中时,您无法将其拉出,运行或标记具有该名称的任何图像scratch
。相反,你可以参考你的Dockerfile
。例如,要使用scratch
以下命令创建最小容器:
FROM scratch
ADD hello /
CMD ["/hello"]
假设您从Docker GitHub示例C源代码构建了“hello”可执行示例,并且使用该-static
标记编译了该示例,则可以使用以下命令构建此 Docker 映像:docker build --tag hello .
注意:由于 Docker for Mac 和 Docker for Windows 使用 Linux VM,因此必须使用 Linux 工具链编译此代码,以最终形成 Linux 二进制文件。不用担心,您可以快速下载 Linux 映像和构建环境并在其中构建:
$ 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
然后,您可以使用以下命令运行它(在 Linux,Mac 或 Windows 上): docker run --rm hello
本示例将创建教程中使用的 hello-world 图像。如果你想测试它,你可以克隆图像回购。
更多资源
有更多的资源可以帮助你写你的Dockerfile
。
Dockerfile
有关参考部分中可用于a的所有说明的完整指南。
- 为了帮助您编写清晰,可读,可维护的文档
Dockerfile
,我们还编写了Dockerfile
最佳实践指南。
- 如果您的目标是创建一个新的官方存储库,请务必阅读Docker的官方存储库。
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com