В этой статье описан процесс развертывания 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.