I have a Phoenix application that uses elasticsearch-elixir. I’m deploying with Mix releases, and trying to call an indexing function against this compiled release.
The docs have a guide on running these tasks in a Distillery release. They suggest adding the following module:
defmodule Backend.Release do # OTP apps that must be started in order for the code in this module # to function properly. # # Don't forget about Ecto and Postgrex if you're using Ecto to load documents # in your Elasticsearch.Store module! @start_apps [ :crypto, :ssl, :postgrex, :ecto, :elasticsearch ] # Ecto repos to start, if any @repos Application.get_env(:my_app, :ecto_repos, ) # Elasticsearch clusters to start @clusters [Backend.Elasticsearch.Cluster] # Elasticsearch indexes to build @indexes [:instances] def build_elasticsearch_indexes() do start_services() IO.puts("Building indexes...") Enum.each(@indexes, &Elasticsearch.Index.hot_swap(Backend.Elasticsearch.Cluster, &1)) stop_services() end # Ensure that all OTP apps, repos used by your Elasticsearch store, # and your Elasticsearch Cluster(s) are started defp start_services do IO.puts("Starting dependencies...") Enum.each(@start_apps, &Application.ensure_all_started/1) IO.puts("Starting repos...") Enum.each(@repos, & &1.start_link(pool_size: 1)) IO.puts("Starting clusters...") Enum.each(@clusters, & &1.start_link()) end defp stop_services do :init.stop() end end
I’ve tried this setup, and then running
my_app eval "MyApp.ReleaseTasks.build_elasticsearch_indexes" against the compiled binary. However, it causes an error:
Starting dependencies... Starting repos... Starting clusters... Building indexes... ** (exit) exited in: GenServer.call(Backend.Elasticsearch.Cluster, :config, 5000) ** (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 started (elixir) lib/gen_server.ex:1000: GenServer.call/3 (elasticsearch) lib/elasticsearch/indexing/index.ex:32: Elasticsearch.Index.hot_swap/2 (elixir) lib/enum.ex:783: Enum."-each/2-lists^foreach/1-0-"/2 (elixir) lib/enum.ex:783: Enum.each/2 lib/backend/release.ex:29: Backend.Release.build_elasticsearch_indexes/0 (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6 (elixir) lib/code.ex:240: Code.eval_string/3
I think I remember reading somewhere that
Application.ensure_all_started is no longer the recommended way to do something like this, but I can’t find it now. Does the above module look reasonable for Elixir 1.9 releases? Is there an obvious reason I’m missing that this doesn’t work?