73 lines
1.4 KiB
Docker
73 lines
1.4 KiB
Docker
# syntax=docker/dockerfile:1.7
|
|
|
|
# Use the official Alpine Elixir image; keep the version in sync with mix.exs
|
|
ARG ELIXIR_VERSION=1.15
|
|
FROM elixir:${ELIXIR_VERSION}-alpine AS build
|
|
|
|
ENV LANG="en_US.UTF-8" \
|
|
MIX_ENV="prod" \
|
|
HOME="/app"
|
|
|
|
WORKDIR /app
|
|
|
|
RUN apk update && \
|
|
apk add --no-cache \
|
|
build-base \
|
|
sqlite-dev \
|
|
openssl-dev \
|
|
ca-certificates
|
|
|
|
RUN mix do local.hex --force, local.rebar --force
|
|
|
|
# Only copy files necessary to download deps to maximize layer caching
|
|
COPY mix.exs mix.lock ./
|
|
COPY config config
|
|
|
|
RUN mix deps.get --only ${MIX_ENV} && \
|
|
mix deps.compile
|
|
|
|
# Copy the rest of the application source
|
|
COPY lib lib
|
|
COPY priv priv
|
|
COPY assets assets
|
|
|
|
RUN mix compile
|
|
RUN mix assets.deploy
|
|
RUN mix release
|
|
|
|
# Minimal runtime image
|
|
FROM alpine:3.19 AS app
|
|
|
|
ENV LANG="en_US.UTF-8" \
|
|
MIX_ENV="prod" \
|
|
PORT="4000" \
|
|
PHX_SERVER="true" \
|
|
DATABASE_PATH="/app/data/action_requests_demo.db"
|
|
|
|
WORKDIR /app
|
|
|
|
RUN apk add --no-cache \
|
|
openssl \
|
|
ncurses-libs \
|
|
libstdc++ \
|
|
sqlite \
|
|
ca-certificates
|
|
|
|
# Keep SQLite data outside of the release directory so it can persist as a volume
|
|
RUN install -d -m 0755 /app/data
|
|
|
|
COPY --from=build /app/_build/prod/rel/action_requests_demo ./
|
|
|
|
RUN addgroup -S app && \
|
|
adduser -S app -G app && \
|
|
chown -R app:app /app
|
|
|
|
USER app
|
|
|
|
EXPOSE 4000
|
|
VOLUME ["/app/data"]
|
|
|
|
ENTRYPOINT ["./bin/action_requests_demo"]
|
|
CMD ["start"]
|
|
|