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 表示从零开始构建镜像,不依赖任何基础镜像(如 ubuntualpine)。
  • 用途
    • 用于构建极简镜像,通常只包含应用程序及其最小依赖,不带操作系统组件。
    • 适用于静态编译的二进制文件(如用 Go 语言编写的程序),因为这些文件无需额外的库或 shell。
  • 特点
    • 大小极小,因为不包含任何预装内容。
    • 不包含 shell(如 /bin/sh),因此无法运行需要 shell 的命令。
  • 示例
    1
    2
    3
    FROM scratch
    COPY my-binary /app
    CMD ["/app"]
    这个 Dockerfile 从 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

rootfsscratch 的关系

  • 当你使用 FROM scratch 时,容器的 rootfs 初始是空的,你需要手动添加所有必要的文件(比如二进制文件、库等)。
  • 相比之下,使用基础镜像(如 FROM ubuntu)会自动提供一个完整的 rootfs,包含操作系统的基础文件。

总结

  • **rootfs**:容器运行时的文件系统基础,来源于镜像,提供运行环境。
  • **scratch**:一个空的起点镜像,用于极简构建,不含任何预置内容。