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 」も追加する設定を入れます。
これは、自動生成されたパッケージの中に「 cowboy (erlangで書かれた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については、以下で触れられていました。
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 にアクセスします。
画面が表示されました。
余談:
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 #