Под катом небольшое и простое руководство, в котором показано, как использовать Docker Compose для настройки и запуска приложения Elixir/Phoenix + PostgreSQL.
Подготовка
Создаем пустой каталог <app_dir> и переходим в него:
mkdir <app_dir> && cd <app_dir>
Создаем Dockerfile и наполняем содержимым.
<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
Создаем docker-compose.yml и наполняем содержимым.
<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>
Создание проекта
Генерируем новое приложение, используя docker-compose, где <app_name> — имя приложения:
docker-compose run web mix phx.new . --app <app_name>
Если вы используете Docker в Linux, то созданные файлы принадлежат root, так как контейнер запускается от его имени. Чтобы избежать трудностей в дальнейшем, нужно поменять владельца:
sudo chown -R $USER:$USER .
Подключение к базе данных
Для подключения к базе данных в настройках нашего приложения необходимо изменить два файла:
<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
После того как настройки откорректированы, создаем базу для каждого окружения:
docker-compose run web mix ecto.create
docker-compose run test mix ecto.create
Запуск приложения
Ну и осталось только запустить наше приложение:
docker-compose up -d
Вот и все. Теперь наше приложение доступно по адресу http://127.0.0.1:4000.
Тесты
И в концовке про тестирование.
Для того, чтобы выполнить все тесты, нужно выполнить:
docker-compose run test
Чтобы выполнить конкретный тест:
docker-compose run test mix test test/<app_name>_web/controllers/page_controller_test.exs
На этом все, всем добра!