Skip to main content

priv/templates/docker/dockerfile_v01.eex

# ---- Build Stage ----
FROM elixir:<%= @elixir_vsn %>-alpine AS app_builder

RUN apk update && apk add --no-cache ca-certificates curl make git rsync g++ docker aws-cli
# flag to build on M-based macs Docker using QEMU
ENV ERL_FLAGS="+JMsingle true"
RUN mix local.hex --force
RUN mix local.rebar --force

ARG RELEASE_NAME
ARG RELEASE_OPTIONS
ARG MAREA_DEPLOY
ARG MAREA_TARGET
ENV MIX_ENV=prod \
  LANG=C.UTF-8 \
  MAREA_DEPLOY=$MAREA_DEPLOY \
  MAREA_TARGET=$MAREA_TARGET
RUN mkdir -p /app/_build
WORKDIR /app
COPY apps ./apps
COPY config ./config
COPY deps ./deps
COPY rel ./rel
COPY mix.exs .
COPY mix.lock .
# it does not contain prod/rel to force generation
COPY _build/prod ./_build/prod
<%= for dep <- @path_deps do %>COPY <%= Path.basename(dep) %> /<%= Path.basename(dep) %>
<% end %>
<%=
  case @rebuild_deps do
    [] ->
      ""
    _ ->
      deps = Enum.join(@rebuild_deps, " ")
      "RUN mix deps.clean #{deps} && mix deps.get && mix deps.compile #{deps}"
  end
%>

RUN mix release $RELEASE_NAME $RELEASE_OPTIONS --no-compile
COPY mix.lock /app/_build/prod/rel/$RELEASE_NAME

<%= @extra_stages %>


# ---- Application Stage ----
FROM alpine AS app
ARG RELEASE_NAME
ARG MAREA_GIT_VSN

RUN adduser -h /home/app -D app \
  && apk add --no-cache libstdc++ ncurses-libs openssl

COPY --from=app_builder --chown=app:app /app/_build/prod/rel/${RELEASE_NAME} /opt/${RELEASE_NAME}

WORKDIR /opt

RUN \
  echo -e "${MAREA_GIT_VSN}" > /opt/vsn \
  && echo "exec /opt/${RELEASE_NAME}/bin/${RELEASE_NAME} start" > start.sh \
  && chmod a+x start.sh \
  && echo -e "#!/bin/sh\nexec /opt/${RELEASE_NAME}/bin/${RELEASE_NAME} remote" > console.sh \
  && chmod a+x console.sh \
  && echo -e "#!/bin/sh\nexec /opt/${RELEASE_NAME}/bin/${RELEASE_NAME} remote" > /usr/local/bin/console \
  && chmod a+x /usr/local/bin/console

<%= @extra_app_steps %>

CMD ["sh", "/opt/start.sh"]