#format gfm #acl why:read,write,delete,revert,admin All:read この記事は[MMA Advent Calendar 2016](http://www.adventar.org/calendars/1414) 17日目の記事です。 昨日は ApparitionK さんの [鍋会@MMA](http://appakun.hateblo.jp/entry/2016/12/16/%E9%8D%8B%E4%BC%9A_%40MMA)でした。 # はじめに MMAが管理しているOSSの1つとして、[uecmma/meshi](https://github.com/uecmma/meshi)コマンドがあります。 これは元々MMAが持つコアサーバ(現在はnestという名前です)で管理されていたコマンドで、少なくとも17年前(1999年頃)には存在していた事が確認されています。[^1] このコマンドは簡単に言えば調布でご飯を食べに行く際に、どこにご飯に行くかを考えるときに利用するコマンドです。 meshiコマンドを実行するだけで、ご飯選択を素早く決める事が出来ます。 [^1]: https://twitter.com/hideyu_k/status/758127114730164224 # 問題点 meshiコマンドの実装は100行にも満たないシェルスクリプトです。shコマンドを中で叩いているだけの簡単な実装ですが、内部で`shuf`コマンドが使われている部分に問題があります。 基本的にどこでも動く事が前提とされているのですが、`shuf`コマンドは各ディストリビューションにおいてインストール方法がかなりばらついており、また基本インストール時にはインストールされていない(場合が多い)という致命的な欠陥を抱えています。 基本的に実行する際にはnest上で行われている事を想定していた為に、今まで大きな障害にはならなかったのですが、OSSとなった今そうも言っていられません。どうにかして`meshi`コマンドを皆さんに簡単にお届けする必要があります。 この問題点の解決策として、Dockerを用いたソリューションをご紹介します。 # 使い方 実際に完成した物がこちらになります。 https://github.com/whywaita/docker-meshi https://hub.docker.com/r/whywaita/meshi まずは、最初にローカルマシンにDockerをインストールします。 ``` $ curl -sSL https://get.docker.com/ | sh ``` その後、お使いのシェルで以下のような設定を投入してください。 ``` alias meshi=`docker run whywaita/meshi` ``` あとはローカルで`meshi`コマンドを打てば完了です。 ``` whywaita% meshi kenta whywaita% meshi shirataka whywaita% meshi DJ whywaita% meshi mac ``` # 実装 Dockerfileは以下です。 ``` 1 FROM alpine:latest 2 MAINTAINER whywaita 3 4 RUN apk add --no-cache coreutils curl \ 5 && curl "https://raw.githubusercontent.com/uecmma/meshi/master/meshi" -o /bin/meshi \ 6 && chmod +x /bin/meshi 7 8 CMD /bin/meshi ``` たった8行で実装する事が出来ました。簡単ですね。 shufコマンド以外はどんなディストリビューションでも入っていたため、ディスク容量が非常に軽量なAlpine Linuxを採用しました。 結果として約11MBほどで今回のコマンドは実現出来ています。 Ubuntuなどをそのまま利用するとそれだけでかなりのディスク容量を消費するので、この手は非常に有効的でした。 これ以上するとなると、1度実行したらもう不要なcurlコマンドを削除するなどが考えられるのですが、それほど効果が大きくないためそのまま放置しています。 # まとめ 今回はDockerを用いてmeshiコマンドをどこでも起動出来るようにしてみました。 これでご飯に迷ってもいつでも運用出来ますね!!!!!! meshiコマンドはOSSですので、もし気になる所などがありましたら是非Pull Requestなどどうぞ。 明日の担当はMMA部員よりもMMAについて詳しいと噂のMMA部員ではないicchyrさんです。