слишком узко!
Разработка на Phoenix в Docker среде с горячей перезагрузкой 🔥
- Время на прочтение ~ 3 минуты
- Обновлено: 2 года назад
- Создано: 6 мар. 2023 г.
Что такое Phoenix?
Phoenix — веб-фреймворк созданный на функциональном языке программирования Elixir. Elixir в свою же очередь основан на Erlang, которая использует виртуальную машину BEAM и платформу OTP(Open Telecom Platform). Phoenix подходит для создания веб-приложении реального времени, обеспечивая отказоустойчивость распределенных систем с минимальной задержкой.
Установка Phoenix
Лучшая инструкция по установке Phoenix находится на сайте официального руководства.
Разработка в Docker среде
Создаем Dockerfile
- В корне проекта нужно создать Dockerfile основанный на официальном образе elixir, тем самым избегая установки сред разработок для Elixir и Erlang
FROM elixir:latest
- WORKDIR — задаём рабочую директорию
WORKDIR /app
- Импортируем нужные файлы в рабочую директорию
ADD . /app
- Обновляем образ и устанавливаем следующие пакеты:
npm
- нужен для работы с js зависимостямиbuild-essential
- пакеты необходимы для компиляцииinotify-tools
- в Phoenix встроена живая перезагрузка (Live Reloading). Автоматически обновляет страницу в браузере при изменение кода и ресурсов(heex, ex, exs, css, js, images, и т.д.) на сервере. Чтобы эта функция работала, вам нужен наблюдатель за (файловой системой)[https://github.com/inotify-tools/inotify-tools/wiki].
RUN apt-get update && apt-get -y install npm build-essential inotify-tools
- Устанавливаем js зависимости внутри директории
assets
RUN npm install --prefix ./assets
- Устанавливаем локальные копии
hex
иrebar
hex
- пакетный менеджер для экосистемы Erlangrebar
- инструмент для удобного управления проектом--force
- принудительная установка без приглашения оболочки; в первую очередь предназначен для автоматизации в системах сборки, таких какmake
RUN mix local.hex --force && mix local.rebar --force
- Устанавливаем зависимости и компилируем
RUN mix do deps.get, compile
- Указываем порт 4000
EXPOSE 4000
- Запускаем
bash
-скрипт в корне проекта
CMD ["./dev"]
Итоговый Dockerfile
FROM elixir:latest
WORKDIR /app
ADD . /app
RUN apt-get update && apt-get -y install npm build-essential inotify-tools
RUN npm install --prefix ./assets
RUN mix local.hex --force && mix local.rebar --force
RUN mix do deps.get, compile
EXPOSE 4000
CMD ["./dev"]
Создаем скрипт для запуска проекта
После того, как проект скомпилирован, можно запустить iex
сессию внутри проекта, запустив приведенный ниже скрипт. -S mix
необходим для работы в интерактивной оболочке
#!/bin/sh
exec iex -S mix phx.server
Создаем docker-compose.yml
version: "3.9" # используем свежую версию docker-compose
services:
phoenix-app:
container_name: phoenix-container
restart: always
build: . # указываем путь до Dockerfile, в нашем случае он в корне проекта
environment:
- MIX_ENV=dev # задаем переменные для mix окружения
# монтируем необходимые файлы, которые буду реагировать на изменения в коде. Нужен для работы горячей перезагрузки
volumes:
- ./assets:/app/assets
- ./priv:/app/priv
- ./lib:/app/lib
- ./config:/app/config
ports:
- "4000:4000"
# `tty: true` и `stdin_open: true` необходимы для работы с интерактивной оболочкой. Без этого iex выдаст ошибку
tty: true
stdin_open: true
Выводы
В данной статье показано, как на практике разрабатывать Phoenix
проекты в Docker
среде с горячей перегрузкой.