はじめに
今年を振り返って、最もバズったキーワードは Docker であるということで、異論は無いと思います。
実際私も Docker を使っていて、Elixir と同様、美しく、便利で、楽しいと感じています。
今回は、Docker を使ってElixir の開発環境を構築するやり方をご紹介します。
Dockerで何ができるのか
端的に言うと、クリーンな環境を、任意の構成で、簡単に作り上げることができます。
軽量なので、同じ環境を何度も繰り返し作るのに向いています。
環境は冪等性が保証されており、CIやDevOpsへの応用が期待されます。
Elixirプログラマにとってのメリット
OS Xは、Elixirプログラミングをするには最高の環境だと思います。
しかし、我々の目指すところはElixirで作ったクールなコードをプロダクションで動作させることであり、大抵のプロダクション環境はLinuxだったりします。
Elixirを動作させるには、Erlang/OTP バージョン17のインストールが必要ですが、少なくとも大抵のメジャーなLinuxでは、これを自分でビルドしなければなりません。
さらに、ElixirもGitHubからクローンする必要があります。
brew install elixir でサクッと入るわけではないのです。(何度 make clean test したことか。)
Dockerを使えば、この悩みを解消することができます。
すなわち、Docker以外ほとんど何も入っていない状態のLinux上でも、サクッとElixirの開発環境を構築することができるのです。
今回の環境
Ubuntu 14.04 LTS
全体の手順
Dockerをインストール
|> Docker Hubからイメージをダウンロード
|> コンテナを起動
|> Elixirする
やってみよう
Dockerをインストール
$ sudo apt-get install -y docker
Docker Hubからイメージをダウンロード
ここでは、手順をシンプルにするため、予め私がビルドしてDocker Hubで公開しているイメージを使います。
Docker Hubのリポジトリはこちら。 https://hub.docker.com/u/keithseahus/
$ sudo docker pull keithseahus/elixir-ubuntu-14.04lts
初回は、ダウンロードに時間がかかります。コーヒー淹れるなりコード書くなりして待ちましょう。
コンテナを起動
$ sudo docker run -i -t keithseahus/elixir-ubuntu-14.04lts zsh
Elixirする
% iex
中身は何なのか
Dockerイメージの構成を定義するのがDockerfileですが、私が公開しているイメージは、複数のDockerfileから成り立っています。
- base-ubuntu-14.04lts
- erlang-otp-ubuntu-14.04lts
- elixir-ubuntu-14.04lts
ベースは、公式のUbuntuイメージをベースに、どの開発にも共通して最低限必要となる(又は入っていると非常に嬉しい)ツールをインストールしたものです。また、いわゆるドットファイル(.emacsとか.tmux.confとか.zshrcとか)も、私のGitHubからクローンしており、コンテナを起動したら即座に開発を開始できるようにしています。
このイメージは汎用的に使うことを目的としたもので、他の言語向けイメージの土台にもなっています。
Erlang/OTPのイメージは、上記イメージにErlang/OTP 17をインストールしたものです。
Ubuntu 14.04 LTSのリポジトリにあるバージョンは16なので、ソースをダウンロードしてコンパイルしています。
その際に、configureオプションを指定し、極力多くの機能を有効にしています。なので、JavaもWxも入っていますし、HiPEも有効です。
そして、Elixirのイメージ。Elixirの最新版をダウンロードして make clean test
しています。
自分でやるには
必要なDockerfileを作って、動作確認した後、GitHubで公開しましょう。(参考: https://github.com/keithseahus/dockerfiles )
Docker Hub から Automated Build を選ぶと、GitHubを連携して、Dockerfileのあるディレクトリ・パスを指定すると、Docker Hubが取り込んでくれます。
GitHubにpushしたら自動的にDocker Hubでビルドを行う設定もあります。ただ、私のように一つのGitHubリポジトリで複数のDockerfileを管理していると、一つpushしただけで、Docker Hubでは全部ビルドが走ってしまうのが玉にキズです。(かといって、GitHubでリポジトリを分けるのは、個人的にはやりたくないのですが。)
まとめ
Dockerを使ってElixirの開発環境をサクッと構築するやり方をご紹介しました。
実際、CIやDevOpsに向いていますので、これをベースにElixirのアプリケーションをJenkinsでテストする環境も、簡単に構築できますね。
また、今回Ubuntuでしたが、CentOS 7のイメージも近日作成しようと思います。
明日は @mtwtk_man さんです。