创建基础镜像
大多数 Dockerfile 从父映像开始。如果您需要完全控制图像的内容,则可能需要创建一个基础图像。区别如下:
父图像是 您的图像所基于的图像。它指的是
FROM
Dockerfile 中指令的内容。 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 映像:-static
docker 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 官方镜像。