最小HTTPD Docker image (< 80kB)

ポエムパート

さて、〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓という必要から sidecar として httpd を生やすことになった一行だったが、そのために nginx.conf を書いて FROM nginx に ADD してあーしてこうして……そしてその無意味な仕事のために50MBの (alpine 版も 十数MB ある) コンテナを生成し、どこかに置く、あるいは --volume だか ConfigMap だかを書いて生の nginx に無理やり設定ファイルを注入する、といったことを繰り替えして終わるお前の人生

alpine darkhttpd イメージより 180 倍小さい httpd イメージ

こういうとき手元ではどうする?もちろん darkhttpd を立てる。ところで darkhttpd の image を探すと alpine 上に apk でインストールしているというのが多い。2MB。アホか

シングルバイナリの darkhttpd

-static つけて musl とリンクして一発

docker イメージにする

まず考えるのはこういうやつだ。

FROM scratch
ADD ./darkhttpd /darkhttpd
ENTRYPOINT ["/darkhttpd"]
CMD ["/"]

おっと、自分自身を配ってしまう。まあそれは darkhttpd に手を入れて解決してもいいんだが (起動したら自分を消すとか)、 -v /mnt:/ したときが最悪だ。そしてそれは必ず起きる。

そこで実際に書くのはこんなかんじだ:

FROM scratch
RUN mkdir /public
ADD ./darkhttpd /darkhttpd
ENTRYPOINT ["/darkhttpd"]
CMD ["/public"]

人間はおろかなので scratch イメージでも mkdir を試みてしまう。

結局、 multistage build でディレクトリをビルドするという感じになる。ディレクトリはファイルであり、ファイルはビルドして生成するものだということ、 空のディレクトリを作るのも天地創造以前は不可能だったということ、 busybox はいわばスコップだということなどの当然の事実ともう一度向き合うことになる。

FROM busybox
RUN mkdir /public

FROM scratch
COPY --from=0 /public /public
ADD ./darkhttpd /darkhttpd
ENTRYPOINT ["/darkhttpd"]
CMD ["/public"]

アホ向けにイメージ上げといた: https://hub.docker.com/r/iorivur/darkhttpd/

サイズ感として、70kB台というかんじです。

結論

mkdir を使うためだけに multistage build は草