Docker of mix release crashes with "Exec format error"

Background

I have an executable created via mix release which works just fine when I run it with start on my local machine. However, my docker image crashes when trying to start the executable and I don’t know why.

Docker

FROM elixir:1.10

# Install Hex + Rebar
RUN mix do local.hex --force, local.rebar --force

COPY . /
WORKDIR /

ENV MIX_ENV=prod
RUN mix do deps.get --only $MIX_ENV, deps.compile
RUN mix release

EXPOSE 8080
ENV PORT=8080
ENV SHELL=/bin/bash

CMD ["_build/prod/rel/my_app/bin/my_app", "start"]

This is my docker file. It does nothing special other than compiling and then trying to run the release via start.

Error

However, when I execute the docker image with docker run -p 8080:8080 my-app:1.0 docker crashes:

/_build/prod/rel/my_app/releases/0.1.0/../../erts-10.5/bin/erl: 12: exec: /_build/prod/rel/my_app/erts-10.5/bin/erlexec: Exec format error

Research

At first I thought this was happening because the file _build/prod/rel/my_app/bin/my_app was missing #!/usr/bin/env bash at the top.

While indeed it doesn’t have that, it has something else that should equally work: #!/bin/sh

So this theory is out.

Another thing that may be possible is that, since this is the release of an umbrella app (in which there are 3 apps) maybe there is a race condition in launching the apps that is causing an internal error and makes the image crash.

However, I can’t confirm this.

Question

Is something wrong with my Dockerfile?
How can I get rid this error?

Are you excluding _build and deps from your Docker build? This post suggests that might help avoid cross-compilation headaches.

1 Like