scratchコンテナの中身を調べてみた件

# scratchコンテナってなんだ？

Dockerコンテナで最小限の構成のものらしい。
ただ、Dockerは簡単に言うとchroot環境なので、chroot環境に必要なものは用意されている模様。

# とりあえず作ってみる
Dockerfile書いてビルドしてみます。

``` :Dockerfile
FROM scratch
```

``` :Terminal
$ 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?
```

あ、怒られた。何も変更がないとビルドが出来ないようなのでとりあえず、適当にテキストファイルを突っ込んでみましょう。

``` :Dockerfile
FROM scratch
COPY ./a.txt /a
```

``` :Terminal
$ 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
```

今度はうまく行きました。サイズを見ていきましょう。

``` :Terminal
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
minimum             latest              7477d58eb207        9 minutes ago       2B
```

2Bytesしかないコンテナができました。

# ログインできないのでshを入れてみよう

このままだと中に入ることすら出来ないので、shコマンドをつっこみます。
共有ライブラリも入ってないので、一緒に入れましょう。(以下のそれぞれのファイルをカレントディレクトリに突っ込んでいます)

``` :Dockerfile
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"]
```

``` :Terminal
$ 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
```
問題なくできました。

``` :Terminal
$ docker run -it --name minimum minimum:latest sh
# 
```

ちゃんと入れましたね。

ここから、シェルのビルトインコマンドを使って中身を見ていきます。


``` :Terminal(Dockerコンテナ内)
# 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コマンドの使えるコンテナが出来ました。

# あれれー、おっかしいぞー

``` :Terminal
$ 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よりでかい…

``` :Terminal
$ ls -alh libc.so.6 
-rwxr-xr-x 1 tterashima tterashima 2.0M  1月 17 14:18 libc.so.6
```

glibcデカ…
busyboxは共有ライブラリ一切使っていないので、余分なものない分小さくなるようですね。