pre.hn/site/posts/2019-12-13-elixir-on-heroku-with-docker.md

50 lines
2.2 KiB
Markdown
Raw Normal View History

2023-09-22 12:58:31 +00:00
---
title: Elixir on Heroku with Docker Containers
---
It is possible to deploy your Elixir application on Heroku using the [Elixir Buildpack
](https: //github.com/HashNuke/heroku-buildpack-elixir). However, you may want to deploy using Docker on Heroku instead. Perhaps your application has complex setup or configuration needs. Or perhaps you already have a Docker-ified application and you dont want to have to do extra work to convert it to buildpacks and Procfiles.
Heroku supports Docker via the [Container Registry and Runtime](https://devcenter.heroku.com/articles/container-registry-and-runtime). Heres the process of getting it set up:
1. Create a Heroku application with `heroku create <app_name>`.
2. Set the Heroku stack to “container” `heroku set:stack container`. This enables the container functionality and ensures that Heroku doesnt become confused if your project also contains other manifests (such as package.json or Gemfile).
3. Set up your Docker environment to talk to Herokus Docker registry instead of the default Docker registry: `heroku container:login`.
4. Build the image and push it to the Heroku registry: `heroku container:push web`.
5. Deploy it to your dynos: `heroku container:release web`.
6. Check your site and make sure everything works.
7. If your application does not boot and logs the error message `Shall I install Hex? (if running non-interactively, use \"mix local.hex --force\") [Yn] ** (Mix) Could not find an SCM for dependency :phoenix from <app_name>.Mixfile`, you may have to make a small change to your Dockerfile.
- Add ENV MIX_HOME=/opt/mix before you install hex & rebar in your Dockerfile. The reason this is needed from what I can gather is that Herokus Docker execution environment is different from your local development environment.
For reference, heres my full Dockerfile for my Phoenix application:
```Dockerfile
FROM elixir:1.8.0-alpine
RUN apk add make gcc libc-dev
ENV CC=gcc
ENV MIX_HOME=/opt/mix
RUN mix local.hex --force \\
&& mix local.rebar --force
WORKDIR /root/app
ADD ./ /root/app/
EXPOSE 4000
ARG MIX_ENV=prod
RUN echo ${MIX_ENV}
ENV MIX_ENV=$MIX_ENV
ENV PORT=4000
RUN mix deps.get
RUN mix deps.compile
RUN MAKE=cmake mix compile
RUN mix phx.digest
CMD [\"mix\", \"phx.server\"]
```