创建基础图像
预计阅读时间:3分钟
大多数Dockerfile从父映像开始。如果需要完全控制图像的内容,则可能需要创建基本图像。区别在于:
-
一个父映像是你的形象是基于图像。它引用
FROM
Dockerfile中指令的内容。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
。
- 在参考部分中,有一份完整的指南,可供您使用的所有说明
Dockerfile
。 - 为了帮助您编写清晰,可读,可维护的内容
Dockerfile
,我们还编写了Dockerfile
最佳做法指南。 - 如果您的目标是创建一个新的官方映像,请务必阅读Docker的官方映像。