Elixir
docker
ElixirDay 10

Elixir開発環境の構築をDockerでやる

More than 1 year has passed since last update.

はじめに

今年を振り返って、最もバズったキーワードは 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 さんです。