FROM elixir:1.12.3-alpine AS elixir-builder

RUN apk add git

RUN mix local.hex --force \
  && mix local.rebar --force

EXPOSE 4000
# Default EPMD port
EXPOSE 4369

ARG MIX_ENV=prod
RUN echo ${MIX_ENV}
ENV MIX_ENV=$MIX_ENV
ENV PORT=4000

WORKDIR /root/app

# We load these things one by one so that we can load the deps first and
#   cache those layers, before we do the app build itself
ADD ./priv ./priv
ADD ./mix.exs ./mix.lock ./
ADD ./config ./config
ADD ./apps/admin/mix.exs ./apps/admin/
ADD ./apps/app/mix.exs ./apps/app/
ADD ./apps/content/mix.exs ./apps/content/
ADD ./apps/core/mix.exs ./apps/core/
ADD ./apps/object_storage/mix.exs ./apps/object_storage/

RUN mix deps.get
RUN mix deps.compile

ADD ./apps /root/app/apps

# Leave off here so that we can built assets and compile the elixir app in parallel

FROM node:16.10.0 AS asset-builder

# Build assets in a node container
ADD ./apps/app/assets/ /root/app/apps/app/assets/

WORKDIR /root/app/apps/app/assets/
COPY --from=0 /root/app/ /root/app/
RUN npm install

ADD ./apps /root/app/apps
RUN npm run deploy

FROM elixir-builder

ADD ./apps /root/app/apps

# Resume compilation of the elixir app
RUN MAKE=cmake mix compile

# Copy in the built assets & fingerprint them
COPY --from=asset-builder /root/app/apps/app/priv/static/ /root/app/apps/app/priv/static
RUN mix phx.digest

CMD elixir --name ${NAME:=legendary}@$(hostname -f) -S mix phx.server