みずりゅの自由帳

主に参加したイベントやソフトウェア技術/開発について記録しています

Dockerを使ってPhoenixを試す

ElixirベースのフレームワークであるPhoenix Frameworkをちょっと試してみたい人向け。
Elixirインストール済みのDockerを利用して、Phoenixを構築/起動するまでの手順。

ひとまずは、コンテナは都度消す設定(--rmオプションの付与)にしています。

手順は以下。

1. コンテナ作成
2. Phoenix起動用の準備1
3. Phoenixのインストール
4. Phoenixのプロジェクト作成
5. Phoenix起動用の準備2
6. Phoenixの起動

自分はコンテナのホストOSはmacで実施していますが、ホストOSによる手順の違いはない認識です。

1. コンテナ作成

Elixirの公式イメージを利用して、コンテナを作成します。
Elixirの公式イメージは、2019年5月30日時点で「1.08GB」あるので、回線に余裕がある場合に実施すると良いです。
Volumeについては、必要に応じでつけると良い。今回の例では利用していません。
ポート番号は、4000ポートを関連付けしています。

$ docker run --rm  -p 4000:4000 -i -t elixir /bin/bash

成功すると、コンテナ(のbash)が起動します。

以降は、コンテナ側での操作となります。

2. Phoenix起動用の準備1

Elixirの公式イメージでは、OSはDebianをベースにしています。
※2019年5月30日時点では「Debian GNU/Linux 9」でした。

Linux上でPhoenixを利用する場合、「inotify-tools」というファイルシステムイベント監視ツールをインストールしておく必要があります。
https://hexdocs.pm/phoenix/installation.html#inotify-tools-for-linux-users

よって、コンテナ内で「inotify-tools」のインストールを行います。

# apt-get update -y && apt-get install inotify-tools -y

3. Phoenixのインストール

mixコマンドを利用して、Phoenix Frameworkの最新版をインストールします。
mixはElixirのビルドツールであり、Rubyにおけるbundle/RubyGems/Rakeにあたるツールです。

https://hexdocs.pm/mix/Mix.html

以下のコマンドで、アーカイブPhoenixを解凍しインストールします。

# mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez

4. Phoenixのプロジェクト作成

ひとまず、新規のプロジェクト「web_nodb」を作ります。
最低限起動できればいいので、DBアクセスはないもので作成します。

# mix phx.new web_nodb --no-brunch --no-ecto

オプションの説明は以下。

  • 「--no-ecto」は、DBアクセス用のECTOファイルを作成しません。
  • 「--no-brunch」は、ビルドツールBrunchに関連するファイルを作成しません。

5. Phoenix起動用の準備2

カレントディレクトリ配下にディレクトリ「web_nodb」ができているので移動します。
ここで、「 mix deps.get 」を実行して依存関係のパッケージの取り込みを行います。(※ rubyのbundle installのイメージ)
ただし、その前に、「 plug_cowboy 」も追加する設定を入れます。
これは、自動生成されたパッケージの中に「 cowboyerlangで書かれたWebサーバ)」が定義されていることが関係しており、CowboyとPlugを連携させるために必要です。

# cd web_nodb/

# sed -i -z 's/{:cowboy, "~> 1.0"}\n/{:plug_cowboy, "~> 1.0"},\n      {:cowboy, "~> 1.0"}\n/g' mix.exs

# mix deps.get

上記の手順ではsed コマンドで追記していますが、エディタを利用して追記しても良いです。
ただし、コンテナ内ではvimもviも入っていませんので、必要に応じて別途apt-getなどでインストールしてください。
参考までに、私が実施した際の「mix.exs」ファイルのdeps部分を載せておきます。

  # Specifies your project dependencies.
  #
  # Type `mix help deps` for examples and options.
  defp deps do
    [
      {:phoenix, "~> 1.3.4"},
      {:phoenix_pubsub, "~> 1.0"},
      {:phoenix_html, "~> 2.10"},
      {:phoenix_live_reload, "~> 1.0", only: :dev},
      {:gettext, "~> 0.11"},
      {:plug_cowboy, "~> 1.0"},            ... この行を追記
      {:cowboy, "~> 1.0"}
    ]
  end


ちなみに、plug_cowboyを追加していない状態で mix deps.get を実施すると警告が出ます。

warning: please add the following dependency to your mix.exs:
    {:plug_cowboy, "~> 1.0"},

PlugCowboyについては、以下で触れられていました。

github.com
qiita.com

6. Phoenix起動

Phoenixを起動させます。

# iex -S mix phx.server
Erlang/OTP 21 [erts-10.3.5.1] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [hipe]

[info] Running WebNodbWeb.Endpoint with Cowboy using http://0.0.0.0:4000
Interactive Elixir (1.8.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>

起動したら、localhost:4000 にアクセスします。

f:id:mzryuka:20190530211347p:plain

画面が表示されました。

余談:

PlugCowboyをインストールしてない状態で動かそうとすると、以下のエラーメッセージが出てきます。

# iex -S mix phx.server
Erlang/OTP 21 [erts-10.3.5.1] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [hipe]

Unchecked dependencies for environment dev:
* plug_cowboy (Hex package)
  the dependency is not available, run "mix deps.get"
** (Mix) Can't continue due to errors on dependencies
#