В этой статье описан процесс развертывания NodeJs приложения, используя NodeJs интерпретатор, находящийся в Docker контейнере, в качестве проектного (по умолчанию). Решение скорее всего будет актуально только для пользователей ОС Linux системы, так как в итоге интерпретатор будет взят из официального образа node на DockerHub.
Зачем?
Приложение можно развернуть, имея на хост-машине только docker, нет необходимости устанавливать интерпретатор самостоятельно, что позволит разработчику иметь конкретную версию интерпретатора для конкретного проекта, а также при смене версии образа в проекте от разработчика ручной настройки не потребуется, новый экземпляр интерпретатора будет использован в проекте автоматически.
Решение
Для примера было создано приложение на ReactJs + Typescipt, так как при некорректной настройке интерпретатора как минимум сломается подсветка кода.
1. Создадим приложение из готового шаблона:
$ npx create-react-app reactjs-typescript-custom-nodejs --template typescript
2. Напишем Dockerfile:
FROM node:14
WORKDIR /app
CMD cp /usr/local/bin/node /app/docker/node && npm install && npm run start
Здесь можно подробнее описать команду CMD
, интерпретатор копируется из контейнера Docker в папку с приложением /app/docker/node
, сама папка /app
является корневой директорией приложения в контейнере. Далее выполняется установка зависимостей и старт приложения в режиме разработки.
3. Создадим в проекте директорию node
с путем docker/node
и поместим туда файл .gitignore
, который игнорирует все в только что созданной папке:
*
4. Далее выполним команду в терминале из корня проекта:
docker build -t client . && docker run -it --rm --volume=${PWD}:/app -p 3000:3000 --name client client
Здесь мы собираем образ из Dockerfile и задаем ему тег, после чего запускаем контейнер в интерактивном режиме -it
с последующим удалением контейнера --rm
, создаем привязку директории проекта на хост-машине к корневой директории приложения в контейнере--volume=${PWD}:/app
, открываем порт в сети -p 3000:3000
и задаем имя контейнеру --name client
.
Таким образом при запуске контейнера экземпляр интерпретатора копируется на хост машину по пути docker/node/node
, осталось указать его путь в настройках idea:
Итог
Приложение разворачивается в dev режиме, корректная подсветка кода, hot-reload и прочие функции, работающие из коробки в react-scripts, при смене версии официального образа NodeJs в Dockerfile дополнительная настройка idea не потребовалась.
Исходный код готового решения доступен на github.