次ログ

次ログ

プログラミング系の記事多め。GoやJavaFXで自作のツールを公開したり、イラストを配布してます。

toiletコマンドのDockerイメージを作った

ジョーク系コマンド、toiletのDockerイメージがなかったので作った。

hub.docker.com

toiletコマンドとは

toiletコマンドについては以下の記事が参考になる。

qiita.com

qiita.com

作った経緯

Unkontributorsの一人として、super_unkoのDockerfileを作った。

github.com

作るに際して、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ベースで作ったイメージだとbashperl、make、gccとかは特にインストールしなくてもよかったので 多分そのへんの細かいツールが最初から含まれているからサイズが巨大なんでしょうね。

toiletでやったこと

で、super_unkoについてはそれで良かったんですが せっかくなのでtoiletだけ使えるようにしたイメージも作ってしまおうと考えました。

元のtoiletリポジトリはすでに更新が止まってるみたいだったんで PR送っても無駄でしょうし、自分で作ってDockerHubに登録してしまっておこう、ということです。

いわゆる昔ながらの手法のconfigureMakefileを生成してmakeするタイプのプロジェクトでしたので 余り経験がなかったのもあり、エラーを追跡するのが非常に大変でした。

まぁ、良い経験になりました。