Developing Elixir / Phoenix Applications with Docker

Under the cat is a small and simple guide that shows how to use Docker Compose to configure and launch the Elixir / Phoenix + PostgreSQL application.
Training
Create an empty <app_dir> directory and go to it:
mkdir <app_dir> && cd <app_dir>
Create a Dockerfile and fill it with content.
<app_dir> / dockerfile
FROM elixir:latest
RUN apt-get update -qq && apt-get install -y libpq-dev && apt-get install -y build-essential inotify-tools erlang-dev erlang-parsetools apt-transport-https ca-certificates && apt-get update && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && echo"deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && apt-get update && apt-get install --no-install-recommends yarn
RUN mix local.hex --force && mix local.rebar --force
RUN mix archive.install hex phx_new 1.4.0 --force
RUN curl -sL https://deb.nodesource.com/setup_11.x | bash - && apt-get install -y nodejs
WORKDIR /home/app
Create docker-compose.yml and fill it with content.
<app_dir> /docker-compose.yml
version: '3'
services:
web:
build: .
command: mix phx.server
volumes:
- .:/home/app
ports:
- "4000:4000"
links:
- db
depends_on:
- db
test:
image: <app_dir>_web
command: mix test
environment:
MIX_ENV: test
PORT: 4001
volumes:
- .:/home/app
db:
image: postgres:latest
ports:
- '5432:5432'
environment:
POSTGRES_USER: <db_user>
POSTGRES_PASSWORD: <db_user_password>
Project creation
We generate a new application using docker-compose, where <app_name> is the name of the application:
docker-compose run web mix phx.new . --app <app_name>
If you are using Docker on Linux, then the created files belong to root, since the container is launched on its behalf. To avoid difficulties in the future, you need to change the owner:
sudo chown -R $USER:$USER .
Database connection
To connect to the database in the settings of our application, you need to change two files:
<app_dir> /config/dev.exs
# Configure your database
config :<app_name>, <App_name>.Repo,
username: <db_user>,
password: <db_user_password>,
database: <app_name>_dev,
hostname: "db",
pool_size: 10
<app_dir> /config/test.exs
# Configure your database
config :<app_name>, <App_name>.Repo,
username: <db_user>,
password: <db_user_password>,
database: <app_name>_test,
hostname: "db",
pool_size: 10
After the settings are adjusted, we create a base for each environment:
docker-compose run web mix ecto.create
docker-compose run test mix ecto.create
Application launch
Well, it remains only to run our application:
docker-compose up -d
That's all. Now our application is available at http://127.0.0.1:4000 .

Tests
And in the end about testing.
In order to perform all the tests, you need to run:
docker-compose run test
To perform a specific test:
docker-compose run test mix testtest/<app_name>_web/controllers/page_controller_test.exs
That's all, all good!