ビルド職人、Dockerの旨味を知る

# 前フリ
この記事は[Tech-Circle Hands on Advent Calendar 2016](http://qiita.com/advent-calendar/2016/techcircle)の12/13の記事です。
昨日は@akiraabeによる[シェル芸人 meets Docker](http://qiita.com/akiraabe/items/ecc4d683ea130cc3db92)でした。
シェル芸は良いものです。この記事もDocker関連なのでカブリました。

# この記事について

この記事が公開される前日は[TechCircle](https://techcircle.connpass.com/)で[試してわかるSDN～Tremaではじめるパケット生成ハンズオン～](
https://techcircle.connpass.com/event/45706/)を開催しました。
その中のLTである「Trema本をbuildする話」の内容からネタ臭を控えめにDockerの活用という観点で焼き直したものです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Trema本をbuildする！ <a href="https://twitter.com/hashtag/docker?src=hash">#docker</a> <a href="https://twitter.com/hashtag/japanese?src=hash">#japanese</a> <a href="https://twitter.com/hashtag/trema%E6%9C%AC?src=hash">#trema本</a> <a href="https://twitter.com/hashtag/techcircleja?src=hash">#techcircleja</a> <a href="https://t.co/5K7ekicOSe">https://t.co/5K7ekicOSe</a> <a href="https://twitter.com/SlideShare">@SlideShare</a>さんから</p>&mdash; Takumi Seike (@seiketkm) <a href="https://twitter.com/seiketkm/status/808313521410699264">2016年12月12日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ここから本題。

# この記事を３行でいうと

1. https://yasuhito.github.io/trema-book/ で公開されているTrema本をビルドするためのdockerイメージを作った
2. docker run --rm -v `pwd`:/data seiketkm/trema-book-build でTrema本ビルドできる
3. 一行余った


# Trema本のbuildする。

[Trema本のフリー版](https://yasuhito.github.io/trema-book/)は全文が公開され、更にPDFファイルを生成する手順が公開されています。

なんと、コレだけ。

```
git clone git@github.com:yasuhito/trema-book.git
cd trema-book
bundle install
bundle exec rake
```

しかし、実際にやってみると一筋縄ではいかないのがわかります。

- buildするためのコマンドが入ってない
- bundle installでnativeモジュールのビルドが出来ない。
- 実はJDKが必要など。

だいたい、コレくらい引っかかって出来たビルド結果はコノザマだったりします。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">絶望のビルド結果です。フォント...！ <a href="https://t.co/nT0VgSY4Ne">pic.twitter.com/nT0VgSY4Ne</a></p>&mdash; Takumi Seike (@seiketkm) <a href="https://twitter.com/seiketkm/status/804638808230637568">2016年12月2日</a></blockquote>

つらい。

# 苦戦の原因はなにか、

間違いなく**ビルド環境の違い**ですね。
執筆者と自分の作業環境が異なっているのでしょう。

# Trema本のbuildをするのにDockerイメージ作ったぞ:whale:

環境の違いがなければ通るはず。
そこでTrema本のbuild環境のDockerイメージを作りました。（依存関係は根性で突き止めました）

Dockerfileとイメージです。よければGithubでスターください。
[github](https://github.com/seiketkm/trema-book-build)
[dockerhub](https://hub.docker.com/r/seiketkm/trema-book-build/)

このイメージを使うと
``docker run --rm -v `pwd`:/data seiketkm/trema-book-build``
だけでtrema本のPDFが手に入ります。

# Dockerfileのつくりかた

イメージ部分に載せる所（環境） と 手順的に実施する所（手順） を分けてます。
以下が作成したものです。

```
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y git ruby-dev openjdk-8-jdk rake ruby-bundler build-essential fonts-vlgothic && rm -rf /var/lib/apt/lists/*
VOLUME /data
ADD build.sh /
WORKDIR /trema-book
ENTRYPOINT ["/bin/bash", "/build.sh"]
```

## Dockerfileの説明
Dockerfileの説明は世の中にいっぱいあるので、簡単に要点だけ抜粋すると。

`RUN` RUNで定義するコマンドは、コマンドが動作した結果がイメージ部分になるのでビルド環境に必要なパッケージ群をインストール。

`VOLUME` Docker上でビルド結果（pdfファイル）を作成したあと、dockerコンテナと共にファイルが消えてしまわないように、ホスト側と共有するディレクトリを指定します。

`ENTRYPOINT` docker runをしたユーザの手元で動く処理を定義します。この例では具体的には追加したシェルスクリプトです。

ENTRYPOINTやCMDで複数のコマンドを指定を出来ない点をbuild.shに定義することでごまかしています。正攻法だと思うのですが、間違ってたら誰か指摘してほしいです。

# Dockerの旨味を知る:yum:

と、このようにDockerfileを作成したことで、Dockerがうごけばどのような環境でもビルドできるようになったはずです。

今回はビルドという題材でDockerを利用しました。
これを実践するまでは、Dockerの旨味はWebアプリを同じ環境で動かす程度の利用価値かと思ってましたが、もっと色々なことに対して応用していけそうですね。

Webの大海にはIDEやらXやらをDockerに入れたりしてる人もいるようで、見識が不足していたカンジです。

# 宣伝
ちなみに私は [Tech-Circle Hands on Advent Calendar 2016](http://qiita.com/advent-calendar/2016/techcircle)は1週間ぶり２度目の登板です。

１本目の[未来からやってきたロボホンのアプリを開発したよ](http://qiita.com/seiketkm/items/46992f933294a7668dba)にも、この記事にも是非**いいね！**をよろしくお願いします。

# 明日の記事

明日の記事は、
@_BSmile_による、Zabbixっぽいなにかです、お楽しみに。