Docker Scratch

# scratchのDocker
[前の記事(Liberty on Docker)](https://qiita.com/suzanHud/items/176de7623f9abd9b7b56)では、「FROM scratch」からDockerfileを書き、それに「alpine-minirootfs」を追加して始めました。
では、「FROM scratch」の状態でどんな感じなんでしょう。

まず、busyboxを用意します。以下の内容としました。

```
bash-5.0# tar tvf busybox-1.33.1.tar.xz
rwxr-xr-x root/root    829000 2021-06-29 16:21:40 bin/busybox
-rwxr-xr-x root/root    604744 2021-05-09 14:35:27 lib/ld-musl-x86_64.so.1bash-5.0#
```

これを用いて、Dockerfileを作ります。

```docker:Dockerfile
FROM scratch
ADD busybox-1.33.1.tar.xz /
CMD ["/bin/busybox","sh"]
```

ビルドします。

```
C:\Docker\scratch>docker build -t alpine:scratch --progress plain .
#1 [internal] load build definition from D.txt
#1 sha256:8a8527aac156990ba8d06fd7c7d20dd2f5393805d6643fdd9209540e1fcd00dd
#1 transferring dockerfile: 26B done
#1 DONE 0.0s

#2 [internal] load .dockerignore
#2 sha256:097436c38e23b81817b37e506f2b80522bc4acbc10b656de0e06b2fb80743ff6
#2 transferring context: 2B done
#2 DONE 0.0s

#3 [internal] load build context
#3 sha256:783171eb8e6d71bea434389157ece90d9bfce5e67b83cb7bdd7e8b2f5e824465
#3 transferring context: 44B done
#3 DONE 0.0s

#4 [1/1] ADD busybox-1.33.1.tar.xz /
#4 sha256:28496066e1d6d3a748a161cb424c518dbb6849c160dda8a44b1f0472280f7cf6
#4 CACHED

#5 exporting to image
#5 sha256:e8c613e07b0b7ff33893b694f7759a10d42e180f2b4dc349fb57dc6b71dcab00
#5 exporting layers done
#5 writing image sha256:3738a4ead8ad904a691fac14eb7775eeb8a3017f0a6eadbf9305a5a53a51ece2 done
#5 naming to docker.io/library/alpine:scratch done
#5 DONE 0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

```

では、動かしてsys/proc以外をリストしてみましょう。

```
C:\Docker\scratch>docker run -it --rm alpine:scratch
/ # /bin/busybox ls -l bin dev etc lib
bin:
total 812
-rwxr-xr-x    1 0        0           829000 Jun 29 16:21 busybox

dev:
total 0
crw--w----    1 0        5         136,   0 Sep 21 00:39 console
lrwxrwxrwx    1 0        0               11 Sep 21 00:39 core -> /proc/kcore
lrwxrwxrwx    1 0        0               13 Sep 21 00:39 fd -> /proc/self/fd
crw-rw-rw-    1 0        0           1,   7 Sep 21 00:39 full
drwxrwxrwt    2 0        0               40 Sep 21 00:39 mqueue
crw-rw-rw-    1 0        0           1,   3 Sep 21 00:39 null
lrwxrwxrwx    1 0        0                8 Sep 21 00:39 ptmx -> pts/ptmx
drwxr-xr-x    2 0        0                0 Sep 21 00:39 pts
crw-rw-rw-    1 0        0           1,   8 Sep 21 00:39 random
drwxrwxrwt    2 0        0               40 Sep 21 00:39 shm
lrwxrwxrwx    1 0        0               15 Sep 21 00:39 stderr -> /proc/self/fd/2
lrwxrwxrwx    1 0        0               15 Sep 21 00:39 stdin -> /proc/self/fd/0
lrwxrwxrwx    1 0        0               15 Sep 21 00:39 stdout -> /proc/self/fd/1
crw-rw-rw-    1 0        0           5,   0 Sep 21 00:39 tty
crw-rw-rw-    1 0        0           1,   9 Sep 21 00:39 urandom
crw-rw-rw-    1 0        0           1,   5 Sep 21 00:39 zero

etc:
total 12
-rw-r--r--    1 0        0               13 Sep 21 00:39 hostname
-rw-r--r--    1 0        0              174 Sep 21 00:39 hosts
lrwxrwxrwx    1 0        0               12 Sep 21 00:39 mtab -> /proc/mounts
-rw-r--r--    1 0        0               97 Sep 21 00:39 resolv.conf

lib:
total 592
-rwxr-xr-x    1 0        0           604744 May  9 14:35 ld-musl-x86_64.so.1
/ #
```

最低限のデバイスのみですね。
busybox:muslの[musl/Dockerfile](https://github.com/docker-library/busybox/blob/54245fc8495d2b69cf6bad72af387eb628604c6a/musl/Dockerfile)も見てみます。

```docker:Dockerfile
FROM scratch
ADD busybox.tar.xz /
CMD ["sh"]
```
上に書いたのと同じようなことをやっていますね。

ちなみにalpinelinuxのDockerファイルは以下です。
```docker:Dockerfile
FROM scratch
ADD alpine-minirootfs-3.15.4-x86_64.tar.gz /
CMD ["/bin/sh"]
```
minirootfsを展開しているだけですね。busyboxはv1.34.1でした。今まで、scrachでrootfsをaddしていたものを変更しようかな。でもCMDは場合によっていらないし。。

##変更履歴
(2019/5/30)shのリンクを削除し、busyboxを使用する変更
(2019/8/27)アーカイブの圧縮をxzに変更。使用するベースのbusyboxを1.31.0とし、情報を再取得。dockerイメージのリストアップを削除。
(2020/5/23)busyboxを1.31.1に変更。
(2021/9/21)busyboxを1.33.1に変更。
(2022/3/26)alpine linuxのbusyboxの記述を追加。