build: Dockerized application
This commit is contained in:
parent
f565395819
commit
579cc97bab
5 changed files with 107 additions and 3 deletions
36
.dockerignore
Normal file
36
.dockerignore
Normal file
|
@ -0,0 +1,36 @@
|
|||
# The directory Mix will write compiled artifacts to.
|
||||
/_build/
|
||||
|
||||
# If you run "mix test --cover", coverage assets end up here.
|
||||
/cover/
|
||||
|
||||
# The directory Mix downloads your dependencies sources to.
|
||||
/deps/
|
||||
|
||||
# Where 3rd-party dependencies like ExDoc output generated docs.
|
||||
/doc/
|
||||
|
||||
# Ignore .fetch files in case you like to edit your project deps locally.
|
||||
/.fetch
|
||||
|
||||
# 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").
|
||||
podcast_feed-*.tar
|
||||
|
||||
# If NPM crashes, it generates a log, let's ignore it too.
|
||||
npm-debug.log
|
||||
|
||||
# The directory NPM downloads your dependencies sources to.
|
||||
/assets/node_modules/
|
||||
|
||||
# Since we are building assets from assets/,
|
||||
# we ignore priv/static. You may want to comment
|
||||
# this depending on your deployment strategy.
|
||||
rel/
|
||||
metadata.json
|
||||
.buildpacks
|
58
Dockerfile
Normal file
58
Dockerfile
Normal file
|
@ -0,0 +1,58 @@
|
|||
# ---- Build Stage ----
|
||||
FROM erlang:21 AS app_builder
|
||||
|
||||
# Set environment variables for building the application
|
||||
ENV MIX_ENV=prod \
|
||||
TEST=1 \
|
||||
LANG=C.UTF-8
|
||||
|
||||
# Fetch the latest version of Elixir (once the 1.9 docker image is available you won't have to do this)
|
||||
RUN set -xe \
|
||||
&& ELIXIR_DOWNLOAD_URL="https://github.com/elixir-lang/elixir/archive/v1.10.3.tar.gz" \
|
||||
&& ELIXIR_DOWNLOAD_SHA256="f3035fc5fdade35c3592a5fa7c8ee1aadb736f565c46b74b68ed7828b3ee1897" \
|
||||
&& curl -fSL -o elixir-src.tar.gz $ELIXIR_DOWNLOAD_URL \
|
||||
&& echo "$ELIXIR_DOWNLOAD_SHA256 elixir-src.tar.gz" | sha256sum -c - \
|
||||
&& mkdir -p /usr/local/src/elixir \
|
||||
&& tar -xzC /usr/local/src/elixir --strip-components=1 -f elixir-src.tar.gz \
|
||||
&& rm elixir-src.tar.gz \
|
||||
&& cd /usr/local/src/elixir \
|
||||
&& make install clean
|
||||
|
||||
# Install hex and rebar
|
||||
RUN mix local.hex --force && \
|
||||
mix local.rebar --force
|
||||
|
||||
# Create the application build directory
|
||||
RUN mkdir /app
|
||||
WORKDIR /app
|
||||
|
||||
# Copy over all the necessary application files and directories
|
||||
COPY config ./config
|
||||
COPY lib ./lib
|
||||
COPY priv ./priv
|
||||
COPY mix.exs .
|
||||
COPY mix.lock .
|
||||
|
||||
# Fetch the application dependencies and build the application
|
||||
RUN mix deps.get
|
||||
RUN mix deps.compile
|
||||
RUN mix phx.digest
|
||||
RUN mix release
|
||||
|
||||
# ---- Application Stage ----
|
||||
FROM debian:stretch AS app
|
||||
|
||||
ENV LANG=C.UTF-8
|
||||
|
||||
# Install openssl
|
||||
RUN apt-get update && apt-get install -y openssl
|
||||
|
||||
# Copy over the build artifact from the previous step and create a non root user
|
||||
RUN useradd --create-home app
|
||||
WORKDIR /home/app
|
||||
COPY --from=app_builder /app/_build .
|
||||
RUN chown -R app: ./prod
|
||||
USER app
|
||||
|
||||
# Run the Phoenix app
|
||||
CMD ["./prod/rel/podcast_feed/bin/podcast_feed", "start"]
|
|
@ -16,8 +16,8 @@ config :podcast_feed, PodcastFeedWeb.Endpoint,
|
|||
cache_static_manifest: "priv/static/cache_manifest.json",
|
||||
server: true,
|
||||
root: ".",
|
||||
version: Application.spec(:phoenix_distillery, :vsn),
|
||||
force_ssl: [rewrite_on: [:x_forwarded_proto]]
|
||||
version: Application.spec(:phoenix_distillery, :vsn)
|
||||
# force_ssl: [rewrite_on: [:x_forwarded_proto]]
|
||||
|
||||
config :podcast_feed,
|
||||
cache_duration: :timer.hours(24)
|
||||
|
|
10
config/releases.exs
Normal file
10
config/releases.exs
Normal file
|
@ -0,0 +1,10 @@
|
|||
import Config
|
||||
|
||||
secret_key_base = System.fetch_env!("SECRET_KEY_BASE")
|
||||
application_port = System.fetch_env!("APP_PORT")
|
||||
application_host = System.fetch_env!("APP_HOST")
|
||||
|
||||
config :podcast_feed, PodcastFeedWeb.Endpoint,
|
||||
url: [scheme: "http", host: application_host, port: String.to_integer(application_port)],
|
||||
http: [:inet6, port: String.to_integer(application_port)],
|
||||
secret_key_base: secret_key_base
|
2
mix.exs
2
mix.exs
|
@ -55,7 +55,7 @@ defmodule PodcastFeed.MixProject do
|
|||
[
|
||||
{:credo, "~> 1.4", only: [:dev, :test], runtime: false},
|
||||
{:dialyxir, "~> 1.0", only: [:dev], runtime: false},
|
||||
{:excoveralls, "~> 0.7", only: [:dev, :test]}
|
||||
{:excoveralls, "~> 0.7", only: [:dev, :test]},
|
||||
]
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue