Mix.Task not available in prod releases

I am trying to reload the config (after programmatically changing the environment) via

Mix.Task.run("loadconfig")

which works fine via iex -S mix but fails after prod release:

$ env MIX_ENV=prod mix release
$ _build/prod/rel/pubsub_elixir/bin/pubsub_elixir start
[...]
    ** (EXIT) an exception was raised:
        ** (UndefinedFunctionError) function Mix.Task.run/1 is undefined (module Mix.Task is not available)
            Mix.Task.run("loadconfig")
[...]

Similar when I call Mix.Tasks.Loadconfig.run([]) directly.

What am I doing wrong?

Mix is not available in built release. It is simply not there at all.

Thanks, makes sense. Is there another way to “reload” the config after env-var changes?

Hey @fergusg welcome! Given that changes to the environment can change an enormous amount about how the application runs (like how it connects to a database, etc) config changes are basically re-deploys. You would normally go about whatever the normal redeploy behavior is to ensure minimal downtime.

The background context is that I am trying to deploy as a Docker image in AWS/ECS and loading the env via the AWS Secrets Manager at runtime (so I can use the same image for prod/test/stage etc)

There are alternatives though, I think… I will investigate

Thanks for your reply.

if you are using Phoenix and Ecto you mostly provide that via an ENV variable like explained here instead of elixir Config. (see the init/2 part)

This can be “copied” over and used by your own code as needed with different ENV variable names.

I’ve also used/still using this kind of setup and see changes to these ENV vars indeed as a new deploy as described by benwilson above.

In my case using neither Phoenix nor Ecto, just plain Elixir. I think a solution is to explicitly pass in the envs as docker arguments (or the AWS/ECS equivalent) rather than trying to load at runtime inside the app.

1 Like