Elixir on PhoenixでDBConnectionエラーでアプリが落ちる場合の解決策
環境: Elixir 1.9.1, Phoenix 1.4を使用
エラー内容は下記の通り。mixにライブラリを追加した後に起こる。急にDBConnectionと言われてDB周りのバグかと思い調べたがそうではなく、mixの書き方の問題だった。
web_1 | web_1 | Generated your_app app web_1 | ** (Mix) Could not start application your_app: YourApp.Application.start(:normal, []) returned an error: shutdown: failed to start child: YourApp.Repo web_1 | ** (EXIT) shutdown: failed to start child: DBConnection.ConnectionPool web_1 | ** (EXIT) exited in: GenServer.call(DBConnection.Watcher, {:watch, DBConnection.ConnectionPool.Supervisor, {DBConnection.ConnectionPool.Pool, {#PID<0.374.$>, #Reference<0.342264912.689831938.179060>, Postgrex.Protocol, [types: Postgrex.DefaultTypes, repo: YourApp.Repo, telemetry_prefix: [:your_app, :repo], otp_app: :your_app, timeout: 15000, username: "postgres", password: "postgres", database: "your_app_dev", hostname: "db", port: 5432, pool_size: 10, pool: DBConnection.ConnectionPool]}}}, infinity) web_1 | ** (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't $ tarted
起こったこととしては下記と同様。 elixirforum.com
解決策としては下記のリンクの通り。
ライブラリを入れる時に mix.exs
の下記パートに applications: [:library_name]
を書くとREADMEにあることが多々あるが、Elixirがよしなにやってくれるので書かなくてよい。
def application do [ mod: {YourApp.Application, []}, extra_applications: [:logger, :runtime_tools] ] end
私が今回入れてこのバグを引き起こしたのは下記のライブラリ。こちらのREADMEを読むと、applicationsパートにライブラリ名を追加しているが、それは不要。 GitHub - fdietz/elixir-feed-parser: Elixir Feed Parser
エラー文言から理解しにくいバグなので、参考になれば。これPhoenixのバージョンいくつ以降は書かないでよくなったみたいな感じなのかも。Elixir, Phoenixは初学者なのでそのあたりの知見がない。