diff --git a/.dockerignore b/.dockerignore index c126478..61a7393 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,39 +1,45 @@ -# flyctl launch added from .elixir_ls/.gitignore -.elixir_ls/**/* +# This file excludes paths from the Docker build context. +# +# By default, Docker's build context includes all files (and folders) in the +# current directory. Even if a file isn't copied into the container it is still sent to +# the Docker daemon. +# +# There are multiple reasons to exclude files from the build context: +# +# 1. Prevent nested folders from being copied into the container (ex: exclude +# /assets/node_modules when copying /assets) +# 2. Reduce the size of the build context and improve build time (ex. /build, /deps, /doc) +# 3. Avoid sending files containing sensitive information +# +# More information on using .dockerignore is available here: +# https://docs.docker.com/engine/reference/builder/#dockerignore-file -# flyctl launch added from .gitignore -# The directory Mix will write compiled artifacts to. -_build +.dockerignore -# If you run "mix test --cover", coverage assets end up here. -cover +# Ignore git, but keep git HEAD and refs to access current commit hash if needed: +# +# $ cat .git/HEAD | awk '{print ".git/"$2}' | xargs cat +# d0b8727759e1e0e7aa3d41707d12376e373d5ecc +.git +!.git/HEAD +!.git/refs -# The directory Mix downloads your dependencies sources to. -deps +# Common development/test artifacts +/cover/ +/doc/ +/test/ +/tmp/ +.elixir_ls -# Where 3rd-party dependencies like ExDoc output generated docs. -doc +# Mix artifacts +/_build/ +/deps/ +*.ez -# Ignore .fetch files in case you like to edit your project deps locally. -.fetch +# Generated on crash by the VM +erl_crash.dump -# If the VM crashes, it generates a dump, let's ignore it too. -**/erl_crash.dump - -# Also ignore archive artifacts (built via "mix archive.build"). -**/*.ez - -# Ignore package tarball (built via "mix hex.build"). -**/aprs-*.tar - -# Ignore assets that are produced by build tools. -priv/static/assets - -# Ignore digested assets cache. -priv/static/cache_manifest.json - -# In case you use Node.js/npm, you want to ignore these. -**/npm-debug.log -assets/node_modules - -fly.toml +# Static artifacts - These should be fetched and built inside the Docker image +/assets/node_modules/ +/priv/static/assets/ +/priv/static/cache_manifest.json diff --git a/Dockerfile-bak b/Dockerfile-bak new file mode 100644 index 0000000..cb1b021 --- /dev/null +++ b/Dockerfile-bak @@ -0,0 +1,97 @@ +# Find eligible builder and runner images on Docker Hub. We use Ubuntu/Debian +# instead of Alpine to avoid DNS resolution issues in production. +# +# https://hub.docker.com/r/hexpm/elixir/tags?page=1&name=ubuntu +# https://hub.docker.com/_/ubuntu?tab=tags +# +# This file is based on these images: +# +# - https://hub.docker.com/r/hexpm/elixir/tags - for the build image +# - https://hub.docker.com/_/debian?tab=tags&page=1&name=bullseye-20250113-slim - for the release image +# - https://pkgs.org/ - resource for finding needed packages +# - Ex: hexpm/elixir:1.18.2-erlang-27.2-debian-bullseye-20250113-slim +# +ARG ELIXIR_VERSION=1.18.2 +ARG OTP_VERSION=27.2 +ARG DEBIAN_VERSION=bullseye-20250113-slim + +ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}" +ARG RUNNER_IMAGE="debian:${DEBIAN_VERSION}" + +FROM ${BUILDER_IMAGE} as builder + +# install build dependencies +RUN apt-get update -y && apt-get install -y build-essential git \ + && apt-get clean && rm -f /var/lib/apt/lists/*_* + +# 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 $MIX_ENV +RUN mkdir config + +# copy compile-time config files before we compile dependencies +# to ensure any relevant config change will trigger the dependencies +# to be re-compiled. +COPY config/config.exs config/${MIX_ENV}.exs config/ +RUN mix deps.compile + +COPY priv priv + +COPY lib lib + +COPY assets assets + +# compile assets +RUN mix assets.deploy + +# Compile the release +RUN mix compile + +# Changes to config/runtime.exs don't require recompiling the code +COPY config/runtime.exs config/ + +COPY rel rel +RUN mix release + +# start a new build stage so that the final image will only contain +# the compiled release and other runtime necessities +FROM ${RUNNER_IMAGE} + +RUN apt-get update -y && \ + apt-get install -y libstdc++6 openssl libncurses5 locales ca-certificates \ + && apt-get clean && rm -f /var/lib/apt/lists/*_* + +# Set the locale +RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen + +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL en_US.UTF-8 + +WORKDIR "/app" +RUN chown nobody /app + +# set runner ENV +ENV MIX_ENV="prod" + +# Only copy the final release from the build stage +COPY --from=builder --chown=nobody:root /app/_build/${MIX_ENV}/rel/aprs ./ + +USER nobody + +# If using an environment that doesn't automatically reap zombie processes, it is +# advised to add an init process such as tini via `apt-get install` +# above and adding an entrypoint. See https://github.com/krallin/tini for details +# ENTRYPOINT ["/tini", "--"] + +CMD ["/app/bin/server"] diff --git a/rel/overlays/bin/migrate b/rel/overlays/bin/migrate index edc8d01..393e79d 100755 --- a/rel/overlays/bin/migrate +++ b/rel/overlays/bin/migrate @@ -1,3 +1,5 @@ #!/bin/sh +set -eu + cd -P -- "$(dirname -- "$0")" exec ./aprs eval Aprs.Release.migrate diff --git a/rel/overlays/bin/server b/rel/overlays/bin/server index 55293ab..bc895ff 100755 --- a/rel/overlays/bin/server +++ b/rel/overlays/bin/server @@ -1,3 +1,5 @@ #!/bin/sh +set -eu + cd -P -- "$(dirname -- "$0")" PHX_SERVER=true exec ./aprs start