scratchコンテナってなんだ?
Dockerコンテナで最小限の構成のものらしい。
ただ、Dockerは簡単に言うとchroot環境なので、chroot環境に必要なものは用意されている模様。
とりあえず作ってみる
Dockerfile書いてビルドしてみます。
FROM scratch
$ docker build -t minimum .
Sending build context to Docker daemon 2.329MB
Step 1/1 : FROM scratch
--->
No image was generated. Is your Dockerfile empty?
あ、怒られた。何も変更がないとビルドが出来ないようなのでとりあえず、適当にテキストファイルを突っ込んでみましょう。
FROM scratch
COPY ./a.txt /a
$ docker build -t minimum .
Sending build context to Docker daemon 2.329MB
Step 1/2 : FROM scratch
--->
Step 2/2 : COPY ./a.txt /a
---> Using cache
---> 7477d58eb207
Successfully built 7477d58eb207
Successfully tagged minimum:latest
今度はうまく行きました。サイズを見ていきましょう。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
minimum latest 7477d58eb207 9 minutes ago 2B
2Bytesしかないコンテナができました。
ログインできないのでshを入れてみよう
このままだと中に入ることすら出来ないので、shコマンドをつっこみます。
共有ライブラリも入ってないので、一緒に入れましょう。(以下のそれぞれのファイルをカレントディレクトリに突っ込んでいます)
FROM scratch
COPY ./sh /bin/sh
COPY ./libc.so.6 /lib/libc.so.6
COPY ./ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
CMD ["/bin/sh"]
$ docker build -t minimum .
Sending build context to Docker daemon 2.328MB
Step 1/5 : FROM scratch
--->
Step 2/5 : COPY ./sh /bin/sh
---> f35b86f5ab7d
Step 3/5 : COPY ./libc.so.6 /lib/libc.so.6
---> 53dd32bd100f
Step 4/5 : COPY ./ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
---> 0459edeb6cb2
Step 5/5 : CMD ["/bin/sh"]
---> Running in f309828bb42f
Removing intermediate container f309828bb42f
---> 9be0af83812c
Successfully built 9be0af83812c
Successfully tagged minimum:latest
問題なくできました。
$ docker run -it --name minimum minimum:latest sh
#
ちゃんと入れましたね。
ここから、シェルのビルトインコマンドを使って中身を見ていきます。
# cd /
# echo *
bin dev etc lib lib64 proc sys
# cd /bin
# echo *
sh
# cd /dev
# echo *
console core fd full mqueue null ptmx pts random shm stderr stdin stdout tty urandom zero
# cd /etc
# echo *
hostname hosts mtab resolv.conf
# cd /lib
# echo *
libc.so.6
# cd /lib64
# echo *
ld-linux-x86-64.so.2
# cd /proc
# echo *
1 acpi asound buddyinfo bus cgroups cmdline consoles cpuinfo crypto devices diskstats dma driver execdomains
fb filesystems fs interrupts iomem ioports irq kallsyms kcore key-users keys kmsg kpagecgroup kpagecount
kpageflags loadavg locks mdstat meminfo misc modules mounts mtrr net pagetypeinfo partitions sched_debug
schedstat scsi self slabinfo softirqs stat swaps sys sysrq-trigger sysvipc thread-self timer_list tty
uptime version version_signature vmallocinfo vmstat zoneinfo
# cd /sys
# echo *
block bus class dev devices firmware fs hypervisor kernel module power
これで存在するファイルが全て見れました。
注)
/bin /lib /lib64の下のファイルはもともと存在しないものです。(今回自分で追加した)
/proc/1はshのプロセスがあるので、もともと存在しないものです。(shでログインしているのでそのプロセスのためのディレクトリです。)
わーい、これで最小限のshコマンドの使えるコンテナが出来ました。
あれれー、おっかしいぞー
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
minimum latest 9be0af83812c 11 minutes ago 2.32MB
busybox 1.31.1 6d5fcfe5ff17 3 weeks ago 1.22MB
busyboxよりでかい…
$ ls -alh libc.so.6
-rwxr-xr-x 1 tterashima tterashima 2.0M 1月 17 14:18 libc.so.6
glibcデカ…
busyboxは共有ライブラリ一切使っていないので、余分なものない分小さくなるようですね。