创建基础镜像
大多数 Dockerfile
从父镜像开始。如果你需要完全控制镜像的内容,则可能需要创建一个基础镜像。区别如下:
- 父镜像是你的镜像所基于的镜像。
它指的是
Dockerfile
中FROM
指令的内容。Dockerfile
中的每个后续声明都会修改此父镜像。 大多数Dockerfile
从父镜像开始,而不是从基础镜像开始。然而,这些术语有时可以互换使用。 - 基础镜像的
Dockerfile
中有FROM scratch
。
本文向你展示了创建基础镜像的几种方法。具体过程很大程度上取决于你要打包的 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
镜像向构建过程发出信号,
表明你希望 Dockerfile
中的下一个命令成为镜像中的第一个文件系统层。
虽然scratch
出现在Hub上的Docker存储库中,但你无法拉取它、运行它或使用名称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 build --tag hello .
不要忘记末尾的.
字符,它将构建上下文设置为当前目录。
使用 docker run
运行你的新镜像
$ docker run --rm hello
此示例创建教程中使用的 hello-world
镜像。如果你想测试一下,可以从镜像库里克隆。
更多资源
有很多资源可帮助你编写Dockerfile
。
- 参考部分提供了
Dockerfile
中所有可用说明的 完整指南。 - 为了帮助你编写清晰、可读、可维护的
Dockerfile
,我们还编写了 Dockerfile最佳实践指南。 - 如果你的目标是创建新的
Docker镜像
,请阅读 Docker官方镜像。