слишком узко!

Разработка на Phoenix в Docker среде с горячей перезагрузкой 🔥

  • Время на прочтение ~ 3 минуты
  • Обновлено: год назад
  • Создано: 6 мар. 2023 г.

alt text

Что такое Phoenix?


Phoenix — веб-фреймворк созданный на функциональном языке программирования Elixir. Elixir в свою же очередь основан на Erlang, которая использует виртуальную машину BEAM и платформу OTP(Open Telecom Platform). Phoenix подходит для создания веб-приложении реального времени, обеспечивая отказоустойчивость распределенных систем с минимальной задержкой.

Установка Phoenix


Лучшая инструкция по установке Phoenix находится на сайте официального руководства.

Разработка в Docker среде


Создаем Dockerfile

  1. В корне проекта нужно создать Dockerfile основанный на официальном образе elixir, тем самым избегая установки сред разработок для Elixir и Erlang
  FROM elixir:latest
  1. WORKDIR — задаём рабочую директорию
WORKDIR /app
  1. Импортируем нужные файлы в рабочую директорию
ADD . /app
  1. Обновляем образ и устанавливаем следующие пакеты:
  • 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
  1. Устанавливаем js зависимости внутри директории assets
RUN npm install --prefix ./assets
  1. Устанавливаем локальные копии hex и rebar
  • hex - пакетный менеджер для экосистемы Erlang
  • rebar - инструмент для удобного управления проектом
  • --force - принудительная установка без приглашения оболочки; в первую очередь предназначен для автоматизации в системах сборки, таких как make
RUN mix local.hex --force && mix local.rebar --force
  1. Устанавливаем зависимости и компилируем
RUN mix do deps.get, compile
  1. Указываем порт 4000
EXPOSE 4000
  1. Запускаем 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 среде с горячей перегрузкой.