最小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 は草