distrolessとdistroless debugの差分を調べた
distrolessというDocker imageは一体何なのか? なぜdistrolessを使うべきなのか?
については、distrolessのREADMEに記載がありますのでそちらを参照してください。
https://github.com/GoogleContainerTools/distroless
"Distroless" images contain only your application and its runtime dependencies.
They do not contain package managers,
shells or any other programs you would expect to find in a standard Linux distribution.
Why should I use distroless images?
Restricting what's in your runtime container to precisely what's necessary for your app is
a best practice employed by Google and other tech giants that have used containers in production for many years.
It improves the signal to noise of scanners (e.g. CVE) and reduces the burden of establishing provenance to just what you need.
distrolessには、shellが含まれているdistroless debugというイメージもあります。
distroless debugについてもREADMEに記載があります。
Distroless images are minimal and lack shell access. The :debug image set for each language provides a busybox shell to enter.
shellはbusyboxのようですね。
busyboxが含まれる以外に差があるのか気になったので調べてみました。
Bazelビルドファイル内のbusyboxビルド設定はこの辺です。 https://github.com/GoogleContainerTools/distroless/blob/3fa91ba3a9f59cab0ca95e7abef7cf94e8b2c449/base/base.bzl#L63
Bazel使った事なくてBazelビルドファイルの読み方がわからないので、docker imageに含まれているファイルを比較してみます。
なお、僕は今はNode.js使ってるので、比較対象は以下の2つにします。
$ docker pull gcr.io/distroless/nodejs:14
$ docker pull gcr.io/distroless/nodejs:14-debug
それぞれのimageのサイズはこのくらい。差は1MBです。
$ docker images | egrep '^REPOSITORY|gcr.io/distroless/nodejs'
REPOSITORY TAG IMAGE ID CREATED SIZE
gcr.io/distroless/nodejs 14 46f9a9a2a874 51 years ago 121MB
gcr.io/distroless/nodejs 14-debug 08e3f40e66c9 51 years ago 122MB
では次に中身の差を見てみます。
docker imageの中身を見るのはdlayerが便利です。
https://github.com/orisano/dlayer
go install
でインストールしましょう。
$ go install github.com/orisano/dlayer@v0.3.1
以下のような感じで実行すると、imageに含まれているファイルのリストを出力する事ができます。
$ docker save gcr.io/distroless/nodejs:14 | dlayer > nodejs-14.log
$ docker save gcr.io/distroless/nodejs:14-debug | dlayer > nodejs-14-debug.log
差分は以下でした。busyboxだけですね。
$ diff -u nodejs-14.log nodejs-14-debug.log
--- nodejs-14.log 2021-06-02 00:24:40.000000000 +0900
+++ nodejs-14-debug.log 2021-06-02 00:24:52.000000000 +0900
@@ -208,6 +208,110 @@
========================================================
+ 1.1 MB $ bazel build ...
+========================================================
+ 1.1 MB busybox/busybox
+ 0 B busybox/[
+ 0 B busybox/[[
+ 0 B busybox/acpid
+ 0 B busybox/add-shell
+ 0 B busybox/addgroup
+ 0 B busybox/adduser
+ 0 B busybox/adjtimex
+ 0 B busybox/ar
+ 0 B busybox/arp
+ 0 B busybox/arping
+ 0 B busybox/ash
+ 0 B busybox/awk
+ 0 B busybox/base64
+ 0 B busybox/basename
+ 0 B busybox/blkdiscard
+ 0 B busybox/blkid
+ 0 B busybox/blockdev
+ 0 B busybox/bootchartd
+ 0 B busybox/brctl
+ 0 B busybox/bunzip2
+ 0 B busybox/bzcat
+ 0 B busybox/bzip2
+ 0 B busybox/cal
+ 0 B busybox/cat
+ 0 B busybox/chat
+ 0 B busybox/chattr
+ 0 B busybox/chgrp
+ 0 B busybox/chmod
+ 0 B busybox/chown
+ 0 B busybox/chpasswd
+ 0 B busybox/chpst
+ 0 B busybox/chroot
+ 0 B busybox/chrt
+ 0 B busybox/chvt
+ 0 B busybox/cksum
+ 0 B busybox/clear
+ 0 B busybox/cmp
+ 0 B busybox/comm
+ 0 B busybox/conspy
+ 0 B busybox/cp
+ 0 B busybox/cpio
+ 0 B busybox/crond
+ 0 B busybox/crontab
+ 0 B busybox/cryptpw
+ 0 B busybox/cttyhack
+ 0 B busybox/cut
+ 0 B busybox/date
+ 0 B busybox/dc
+ 0 B busybox/dd
+ 0 B busybox/deallocvt
+ 0 B busybox/delgroup
+ 0 B busybox/deluser
+ 0 B busybox/depmod
+ 0 B busybox/devmem
+ 0 B busybox/df
+ 0 B busybox/dhcprelay
+ 0 B busybox/diff
+ 0 B busybox/dirname
+ 0 B busybox/dmesg
+ 0 B busybox/dnsd
+ 0 B busybox/dnsdomainname
+ 0 B busybox/dos2unix
+ 0 B busybox/dpkg
+ 0 B busybox/dpkg-deb
+ 0 B busybox/du
+ 0 B busybox/dumpkmap
+ 0 B busybox/dumpleases
+ 0 B busybox/echo
+ 0 B busybox/ed
+ 0 B busybox/egrep
+ 0 B busybox/eject
+ 0 B busybox/env
+ 0 B busybox/envdir
+ 0 B busybox/envuidgid
+ 0 B busybox/expand
+ 0 B busybox/expr
+ 0 B busybox/factor
+ 0 B busybox/fakeidentd
+ 0 B busybox/false
+ 0 B busybox/fatattr
+ 0 B busybox/fbset
+ 0 B busybox/fbsplash
+ 0 B busybox/fdflush
+ 0 B busybox/fdformat
+ 0 B busybox/fdisk
+ 0 B busybox/fgconsole
+ 0 B busybox/fgrep
+ 0 B busybox/find
+ 0 B busybox/findfs
+ 0 B busybox/flash_eraseall
+ 0 B busybox/flash_lock
+ 0 B busybox/flash_unlock
+ 0 B busybox/flashcp
+ 0 B busybox/flock
+ 0 B busybox/fold
+ 0 B busybox/free
+ 0 B busybox/freeramdisk
+ 0 B busybox/fsck
+ 0 B busybox/fsck.minix
+
+========================================================
2.0 MB $ bazel build ...
========================================================
以上です。