构建 Docker
镜像时,我们都是通过 FROM
指定一个已有镜像进行构建,该镜像一般称为基础镜像,它并不是凭空出现的,也是基于 Dockerfile
构建的,那如何创建一个基础镜像呢,本文将通过示例构建 busybox 基础镜像。
基础镜像的构建方法
- 基于 debootstrap 构建 ubuntu 基础镜像
- 基于 moby 构建,参考
- 使用
FROM scratch
构建 - buildah 一个构建
OCI镜像
的工具
构建过程
下面开始构建 busybox 基础镜像
busybox 编译
参考:从源码编译内核 linux-5.15.16 并制作基于 KVM 的 busybox 镜像 中 buysbox 编译
章节编译 busybox,完成后通过如下命令制作 rootfs.tar.gz
:
cd busybox-1.35.0/_install
tar -zcvf rootfs.tar.gz .
准备 Dockerfile
$ cat << EOF >> Dockerfile
FROM scratch
ADD rootfs.tar.gz /
CMD ["bash"]
EOF
Dockerfile 说明:
FROM scratch
翻译为:白手起家;从头做起
,在 docker hub 也要该镜像的说明:an explicitly empty image, especially for building images "FROM scratch"
,就是一个空的镜像。且从 docker 1.5
版本开始,在 Dockerfile
中 FROM scratch
指令并不进行任何操作
As of Docker 1.5.0 (specifically, docker/docker#8827), FROM scratch is a no-op in the Dockerfile, and will not create an extra layer in your image (so a previously 2-layer image will be a 1-layer image instead).
ADD rootfs.tar.gz /
将 buxybox 编译后的包解压到 /
根目录CMD ["bash"]
指定基于该镜像在启动容器时的程序
编译基础镜像
$ docker build -t busybox:1 .
Sending build context to Docker daemon 1.445MB
Step 1/3 : FROM scratch
--->
Step 2/3 : ADD rootfs.tar.gz /
---> Using cache
---> 96b7db3a783d
Step 3/3 : CMD ["bash"]
---> Using cache
---> 6338ef04865f
Successfully built 6338ef04865f
Successfully tagged busybox:1
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox 1 6338ef04865f 1 hours ago 2.71MB
查看镜像
使用 dive 查看镜像,可以看到该镜像只有一个层,如下:
$ dive busybox:1
┃ ● Layers ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ Current Layer Contents ├─────────────────────────────────
Cmp Size Command Permission UID:GID Size Filetree
2.7 MB FROM 6f5345b50167158 drwxr-xr-x 0:0 2.7 MB ├── bin
-rwxrwxrwx 0:0 0 B │ ├── arch → busybox
│ Layer Details ├────────────────────────────────────────── -rwxrwxrwx 0:0 0 B │ ├── ash → busybox
-rwxrwxrwx 0:0 0 B │ ├── base32 → busybox
Tags: (unavailable) -rwxrwxrwx 0:0 0 B │ ├── base64 → busybox
Id: 6f5345b501671581ef9fe69c1900e698d13436a6de4c66caddd -rwxr-xr-x 0:0 2.7 MB │ ├── busybox
92d5ac6e83686 -rwxrwxrwx 0:0 0 B │ ├── cat → busybox
Digest: sha256:188a3a00b503e171b022a32f8ef922ce7d34990ba04c -rwxrwxrwx 0:0 0 B │ ├── chattr → busybox
2b2348e914a910a2235d -rwxrwxrwx 0:0 0 B │ ├── chgrp → busybox
Command: -rwxrwxrwx 0:0 0 B │ ├── chmod → busybox
#(nop) ADD file:24d85fcdccf5f9791509a63964fc4ea2f2518d7445f -rwxrwxrwx 0:0 0 B │ ├── chown → busybox
22b3c6cc81e9fa45345ba in / -rwxrwxrwx 0:0 0 B │ ├── conspy → busybox
-rwxrwxrwx 0:0 0 B │ ├── cp → busybox
│ Image Details ├────────────────────────────────────────── -rwxrwxrwx 0:0 0 B │ ├── cpio → busybox
-rwxrwxrwx 0:0 0 B │ ├── cttyhack → busyb
-rwxrwxrwx 0:0 0 B │ ├── date → busybox
Total Image size: 2.7 MB -rwxrwxrwx 0:0 0 B │ ├── dd → busybox
Potential wasted space: 0 B -rwxrwxrwx 0:0 0 B │ ├── df → busybox
Image efficiency score: 100 % -rwxrwxrwx 0:0 0 B │ ├── dmesg → busybox
-rwxrwxrwx 0:0 0 B │ ├── dnsdomainname →
Count Total Space Path
运行
基于刚才编译好的镜像运行一个容器:
$ docker run -it busybox:1 sh
/ # ls
bin dev etc linuxrc mnt proc sbin sys tmp usr
/ #
其他
- debian 基础镜像构建,可以参考:https://github.com/debuerreotype/docker-debian-artifacts