# Build stage FROM elixir:1.17-alpine AS build # Install build dependencies RUN apk add --no-cache build-base git # Prepare build dir WORKDIR /app # Install hex + rebar RUN mix local.hex --force && \ mix local.rebar --force # Set build ENV ENV MIX_ENV=prod # Install mix dependencies COPY mix.exs mix.lock ./ RUN mix deps.get --only prod RUN mix deps.compile # Copy application files COPY config config COPY priv priv COPY lib lib # Compile the project (generates phoenix-colocated files) RUN mix compile # Copy assets after compilation COPY assets assets # Compile and deploy assets RUN mix assets.deploy # Build release RUN mix release # App stage - use same elixir base to ensure OpenSSL compatibility FROM elixir:1.17-alpine AS app # Install runtime dependencies RUN apk add --no-cache \ libstdc++ \ openssl \ ncurses-libs WORKDIR /app # Copy the release from build stage COPY --from=build /app/_build/prod/rel/my_first_elixir_vibe_code ./ # Create a non-root user RUN addgroup -g 1000 phoenix && \ adduser -D -u 1000 -G phoenix phoenix && \ chown -R phoenix:phoenix /app # Copy entrypoint script and set permissions COPY --chown=phoenix:phoenix entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh USER phoenix EXPOSE 4000 ENTRYPOINT ["/entrypoint.sh"] CMD ["bin/my_first_elixir_vibe_code", "start"]