Как настроить Docker для разработки на nodejs?

Хочу подружить докер и NodeJs. Основная цель - сдлеать контейнер, при запуске которого будут подтягиватся все зависимости NodeJs. Так же должна быть возможность вести разработку с использованием этого контейнера без необходимости устанавливать nodejs на локальной машине.

Если монтировать всю директорию app (вместе с packages.json), нет возможности запускать npm install автоматичесски из Dockerfile (так как при выполнении команды RUN npm install в Dockerfile, packages.json файла еще не будет, так как он монтируется в docker-compose.yml позже). Придется вручную заходить в контейнер и делать npm install.

Во всех туториалах предлагается использовать COPY внутри Dockerfile (https://nodejs.org/en/docs/guides/nodejs-docker-we...
СOPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
Приложение подымается, зависимости подтягиваются, но мы не можем редактировать код с локальной машини, так как он был копирован в докер контейнер вместо монтирования. Нет возможности добавлять npm модули внутри контейнера и сохранять их в packages.json. Тоесть нам придется в таком случае установить nodejs локально и при каждом изменении кода делать composer-compose build.

Может я не правильно понял концепцию докера, и он не предназначен для разработки? Может он предназначен только для деплоя?

Мне кажется аналогичная проблемма будет с composer PHP пакетами.
Если посоветуете, или кините пример вашего решения, или ссылку на проект где это реализовано, буду очень благодарен.

Я хочу иметь возможность в дальнейшем взять докер image и одним кликом поднять его на любом сервер. Без необходимости настраивать внешнее окружение.
  • Вопрос задан
  • 6309 просмотров
Пригласить эксперта
Ответы на вопрос 5
EgorkZe
@EgorkZe
iOS (Swift), GoLang
Я как делаю у себя с англуяром2, разрабатываю на локальной машине, потом билдаю и отправляю откомпиленый код в папку VOLUME (Папка, которая видна и на сервере и внутри контейнера). То есть контейнер линкует папку на сервере к себе, и те изменения которые происходят с этой папкой на сервере - они же происходят и в контейнере
Ответ написан
Комментировать
Denormalization
@Denormalization
А зачем докер для разработки? Он же совсем не про это.
Для разработки, если нужна виртуалка, стоит использовать Vagrant.
Ответ написан
SabMakc
@SabMakc
Для разработки внутри docker-контейнера я в рамках контейнера разворачиваю C9 IDE. Получаем вполне удобную Web-IDE для разработки, доступную отовсюду. Папку с проектами монтирую (проще бекапить).

Если же нужна именно консоль - то заходим в контейнер и из него полноценно работаем.

Вариант с внешним редактором, но с npm в контейнере лично мне не совсем понятен. Если очень хочется - можно отказаться от "npm install" в Dockerfile и монтировать папку. Но даже для такого случая можно написать простой скрипт, который бы вызовы локального npm транслировал в контейнер.
Ответ написан
Комментировать
k3NGuru
@k3NGuru
Сис.админ.КО., подающий надежды кодер :)
Может пригодится https://docs.docker.com/compose/rails/

Рабочая папка хранится на хосте, поднимается 2 докера: Рельсы и Постгре. Сделали изменения в файле, они сразу будут в контейнере.
Запуск bundle install делается таким образом: редактируем Gemfile после docker-compose build. Если сделать bundle install внутри контейнера, то при перезапуске контейнера, он просто не запустится, ругаясь на зависимости.
Для запуска команд используется следующая конструкция: docker-compose run web %command_name%

Думаю можно будет и для NodeJS адаптировать.
Ответ написан
Комментировать
Вместо COPY расшарьте вашему контейнеру с nodejs директорию проекта через volume. А дальше просто укажите в Dockerfile необходимые команды. ( такие как npm install например).

https://github.com/healqq/manacheck/tree/master/docker

Вот конфиг для одной из моих домашних поделок. Посмотрите папку expressjs и dev.yml.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы