Phoenix: releases.exsの簡単な作り方#

Published on 2020-07-06 00:00:00

本記事では mix release により生成したバイナリの Runtime configuration をするreleases.exsの簡単な作り方を紹介します。

本記事では mix release そのものについては扱いません。理由は以下が大変詳しいためです。

releases.exsとは#

releases.exsとはmix releaseで生成するリリースファイルに取り込まれるconfigurationです。

releases.exs とconfig/config.exsから読み込まれる #{Mix.env()}.exs の違いは、その実行タイミングです。 [1]

  1. #{Mix.env()}.exs はMix コマンド実行時に実行される

  2. releases.exs はリリースファイルの起動時に実行される

1.について

以下を試すと、configuration と一見関係なさそうなMix コマンドの mix phx.gen.secret でprod.secret.exsが実行されていることを確認できます。

$ MIX_ENV=prod mix phx.gen.secret
** (RuntimeError) environment variable SECRET_KEY_BASE is missing.
You can generate one by calling: mix phx.gen.secret

2.について

以下を試すと、リリースファイルの実行時にポート変更ができることを確認できます。

$ mix phx.new my_app --no-ecto
$ # 後述する方法でreleases.exsを作り
$ MIX_ENV=prod mix release
$ SECRET_KEY_BASE=super_secret PORT=4001 _build/prod/rel/my_app/bin/my_app start

Mixコマンドの使えないproduction環境ではreleases.exsファイルが必要になります。

releases.exsの作り方#

Mixコマンドで実行されるprod.secret.exsの処理をリリースファイルの実行時に遅延させればよいので、prod.secret.exsをコピーして作るのが簡単そうです。

まず、config/prod.exsのprod.secret.exsの読み込み行をコメントアウトし、prod.secret.exsを使用させないようにします。

# Finally import the config/prod.secret.exs which loads secrets
# and configuration from environment variables.
# import_config "prod.secret.exs" # <--- コメントアウト

次にconfig/prod.secret.exs をconfig/release.exs としてコピーし、

$ cp config/prod.secret.exs config/release.exs

config/releases.exsの use Mix.Configimport Config に書き変えます。

import Config # (before) use Mix.Config

以上です。簡単!