docker镜像构建过程rootfs、scratch含义
1. rootfs
(根文件系统)
rootfs
是指 Docker 容器运行时所依赖的根文件系统(root filesystem)。它是容器内部文件系统的起点,包含了容器运行所需的基本目录结构和文件,比如 /bin
、/lib
、/etc
等。简而言之,rootfs
是容器操作系统的核心部分。
- 来源:在 Docker 中,
rootfs
通常来源于镜像(image)。镜像是一个只读的模板,包含了应用程序及其依赖的操作系统文件。容器启动时,Docker 会基于镜像的rootfs
创建一个可写的容器层。 - 分层结构:Docker 使用 UnionFS(联合文件系统)将多个只读层(如镜像层)和一个可写层(容器层)组合成完整的
rootfs
。 - 作用:提供容器运行时的文件系统环境,确保容器内的进程能够访问所需的文件和库。
rootfs relase
2. scratch
scratch
是 Docker 提供的一个特殊镜像,它是一个完全空的镜像,没有任何文件或目录,可以看作是一个“空白起点”。它是 Docker 镜像构建的最基础层。
- 定义:在
Dockerfile
中,FROM scratch
表示从零开始构建镜像,不依赖任何基础镜像(如ubuntu
或alpine
)。 - 用途:
- 用于构建极简镜像,通常只包含应用程序及其最小依赖,不带操作系统组件。
- 适用于静态编译的二进制文件(如用 Go 语言编写的程序),因为这些文件无需额外的库或 shell。
- 特点:
- 大小极小,因为不包含任何预装内容。
- 不包含 shell(如
/bin/sh
),因此无法运行需要 shell 的命令。
- 示例:这个 Dockerfile 从
1
2
3FROM scratch
COPY my-binary /app
CMD ["/app"]scratch
开始,添加一个编译好的二进制文件my-binary
,并设置其为容器启动时的执行命令。
例子
➜ rootfs ll ### 1.list file
total 54192
drwxr-xr-x 3 mvpbang staff 96 2 14 15:25 1
-rw-r--r-- 1 mvpbang staff 75 2 14 14:17 Dockerfile
-rw-r--r-- 1 mvpbang staff 27739922 8 1 2020 ubuntu-base-20.04.1-base-amd64.tar.gz
➜ rootfs cat Dockerfile ### 2.cat Dockerfile
FROM scratch
ADD ubuntu-base-20.04.1-base-amd64.tar.gz /
CMD ["/bin/bash"]
➜ rootfs docker build -t ubuntu-base:v1 . ### 3.build
[+] Building 0.7s (5/5) FINISHED docker:orbstack
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 112B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build context 0.3s
=> => transferring context: 27.75MB 0.3s
=> CACHED [1/1] ADD ubuntu-base-20.04.1-base-amd64.tar.gz / 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:d9bcca8920cc84553f49ec84c8cdf2eac09be85f7113fa0b4e7c2dda844d9d32 0.0s
=> => naming to docker.io/library/ubuntu-base:v1 0.0s
➜ rootfs docker run --rm -it ubuntu-base:v1 bash ### 4.run && test
root@a886256d48ae:/#
root@a886256d48ae:/# ls /
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
rootfs
和 scratch
的关系
- 当你使用
FROM scratch
时,容器的rootfs
初始是空的,你需要手动添加所有必要的文件(比如二进制文件、库等)。 - 相比之下,使用基础镜像(如
FROM ubuntu
)会自动提供一个完整的rootfs
,包含操作系统的基础文件。
总结
- **
rootfs
**:容器运行时的文件系统基础,来源于镜像,提供运行环境。 - **
scratch
**:一个空的起点镜像,用于极简构建,不含任何预置内容。