前フリ
この記事はTech-Circle Hands on Advent Calendar 2016の12/13の記事です。
昨日は@akiraabeによるシェル芸人 meets Dockerでした。
シェル芸は良いものです。この記事もDocker関連なのでカブリました。
この記事について
この記事が公開される前日はTechCircleで試してわかるSDN~Tremaではじめるパケット生成ハンズオン~を開催しました。
その中のLTである「Trema本をbuildする話」の内容からネタ臭を控えめにDockerの活用という観点で焼き直したものです。
Trema本をbuildする! #docker #japanese #trema本 #techcircleja https://t.co/5K7ekicOSe @SlideShareさんから
— Takumi Seike (@seiketkm) 2016年12月12日
ここから本題。
この記事を3行でいうと
- https://yasuhito.github.io/trema-book/ で公開されているTrema本をビルドするためのdockerイメージを作った
- docker run --rm -v
pwd
:/data seiketkm/trema-book-build でTrema本ビルドできる - 一行余った
Trema本のbuildする。
Trema本のフリー版は全文が公開され、更にPDFファイルを生成する手順が公開されています。
なんと、コレだけ。
git clone git@github.com:yasuhito/trema-book.git
cd trema-book
bundle install
bundle exec rake
しかし、実際にやってみると一筋縄ではいかないのがわかります。
- buildするためのコマンドが入ってない
- bundle installでnativeモジュールのビルドが出来ない。
- 実はJDKが必要など。
だいたい、コレくらい引っかかって出来たビルド結果はコノザマだったりします。
絶望のビルド結果です。フォント...! pic.twitter.com/nT0VgSY4Ne
— Takumi Seike (@seiketkm) 2016年12月2日
つらい。
苦戦の原因はなにか、
間違いなくビルド環境の違いですね。
執筆者と自分の作業環境が異なっているのでしょう。
Trema本のbuildをするのにDockerイメージ作ったぞ
環境の違いがなければ通るはず。
そこでTrema本のbuild環境のDockerイメージを作りました。(依存関係は根性で突き止めました)
Dockerfileとイメージです。よければGithubでスターください。
github
dockerhub
このイメージを使うと
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の旨味を知る
と、このようにDockerfileを作成したことで、Dockerがうごけばどのような環境でもビルドできるようになったはずです。
今回はビルドという題材でDockerを利用しました。
これを実践するまでは、Dockerの旨味はWebアプリを同じ環境で動かす程度の利用価値かと思ってましたが、もっと色々なことに対して応用していけそうですね。
Webの大海にはIDEやらXやらをDockerに入れたりしてる人もいるようで、見識が不足していたカンジです。
宣伝
ちなみに私は Tech-Circle Hands on Advent Calendar 2016は1週間ぶり2度目の登板です。
1本目の未来からやってきたロボホンのアプリを開発したよにも、この記事にも是非**いいね!**をよろしくお願いします。
明日の記事
明日の記事は、
@_BSmile_による、Zabbixっぽいなにかです、お楽しみに。