diff --git a/README.md b/README.md index 946e756..92393e4 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,57 @@ test This will keep the payload smaller and will also avoid any issues when compiling dependencies. +### Multistage Docker Builds + +You can also leverage [docker multistage build](https://docs.docker.com/develop/develop-images/multistage-build/) and [bitwalker/alpine-elixir](https://github.com/bitwalker/alpine-elixir) to lower your image size significantly. + +An example is shown below: + +```dockerfile +FROM bitwalker/alpine-elixir-phoenix:latest AS phx-builder + +# Set exposed ports +ENV MIX_ENV=prod + +# Cache elixir deps +ADD mix.exs mix.lock ./ +RUN mix do deps.get, deps.compile + +# Same with npm deps +ADD assets/package.json assets/ +RUN cd assets && \ + npm install + +ADD . . + +# Run frontend build, compile, and digest assets +RUN cd assets/ && \ + npm run deploy && \ + cd - && \ + mix do compile, phx.digest + +FROM bitwalker/alpine-elixir:latest + +EXPOSE 5000 +ENV PORT=5000 MIX_ENV=prod + +COPY --from=phx-builder /opt/app/_build /opt/app/_build +COPY --from=phx-builder /opt/app/priv /opt/app/priv +COPY --from=phx-builder /opt/app/config /opt/app/config +COPY --from=phx-builder /opt/app/lib /opt/app/lib +COPY --from=phx-builder /opt/app/deps /opt/app/deps +COPY --from=phx-builder /opt/app/.mix /opt/app/.mix +COPY --from=phx-builder /opt/app/mix.* /opt/app/ + +# alternatively you can just copy the whole dir over with: +# COPY --from=phx-builder /opt/app /opt/app +# be warned, this will however copy over non-build files + +USER default + +CMD ["mix", "phx.server"] +``` + ## License MIT