toiletコマンドのDockerイメージを作った
ジョーク系コマンド、toiletのDockerイメージがなかったので作った。
toiletコマンドとは
toiletコマンドについては以下の記事が参考になる。
作った経緯
Unkontributorsの一人として、super_unkoのDockerfileを作った。
作るに際して、Dockerのベースイメージを何にするか考えました。 一番簡単に作れるのはcowsayやtoiletをaptでインストールできるubuntuイメージをベースにすること。 しかしながら、それだと余計なものが入ってしまい、イメージが巨大になってします。
なので、イメージの軽量化目的でalpineベースで作成することにしました。
super_unkoでやったこと
alpineで作成するにあたって、toiletコマンドを動かせるようにするのに大変苦労しました。 理由としては、toiletコマンドのリポジトリのドキュメントに依存ライブラリやビルド方法について何も記載がなかったからです。
なのでビルドが失敗しては不足するものを追加してをひたすらやってなんとかビルドできるようになりました。 ほんとこういうときはドキュメントが大事だなぁと感じた次第です。
ちなみにUbuntuベースで作ったものとalpineベースで軽量化を意識して作ったイメージのサイズは以下のようになりました。 試みとしては十分に成功しました。
ベースイメージ | イメージサイズ |
---|---|
Ubuntu | 195MB |
Alpine | 68.4MB |
軽量化のためにやったことは、不要なパッケージを残さないようにすることだけです。 以下のような具合。
FROM alpine:3.9 AS build-stage RUN apk --no-cache add git bash perl make automake autoconf pkgconfig gcc musl-dev libcaca-dev figlet \ # その他もろもろの処理 ... FROM alpine:3.9 AS exec-stage RUN apk add bash perl libcaca-dev COPY --from=build-stage /usr/local/bin/* /usr/local/bin/ COPY --from=build-stage /usr/local/src/toilet/fonts/* /usr/local/share/figlet/
バイナリの生成のためのbuild-stage
で必要なツール群をapkでインストールしてビルドし、
コマンド実行のためのツールのみを残すexec-stage
に必要なもののみCOPYするというアプローチです。
これだけで100MBほど軽量化できました。
Ubuntuベースで作ったイメージだとbash、perl、make、gccとかは特にインストールしなくてもよかったので 多分そのへんの細かいツールが最初から含まれているからサイズが巨大なんでしょうね。
toiletでやったこと
で、super_unkoについてはそれで良かったんですが せっかくなのでtoiletだけ使えるようにしたイメージも作ってしまおうと考えました。
元のtoiletリポジトリはすでに更新が止まってるみたいだったんで PR送っても無駄でしょうし、自分で作ってDockerHubに登録してしまっておこう、ということです。
いわゆる昔ながらの手法のconfigure
でMakefileを生成してmakeするタイプのプロジェクトでしたので
余り経験がなかったのもあり、エラーを追跡するのが非常に大変でした。
まぁ、良い経験になりました。