Правильный подход к написанию файла Dockerfile с Node в качестве серверной части

#node.js #angular #docker #npm

#node.js #угловой #docker #npm

Вопрос:

Я пишу простое приложение angular, которое использует node в качестве серверной части для загрузки файлов. Моя папка проекта как таковая:

введите описание изображения здесь

Чтобы запустить это в Angular, я делаю

  1. ng serve
  2. Одновременно запустите «nodemon server» в другой командной строке в той же папке, и я готов к работе. Я попытался сделать это в Dockerfile с помощью приведенных ниже инструкций:
 #Getting Base Image
FROM node:latest AS builder

#CMD ["echo", "Docker Image for eOTA Index Page!"]

WORKDIR /app

ENV PATH /app/node_modules/.bin:$PATH


#add app
COPY . /app

#install and app dependencies

COPY server.js /app/server.js

COPY package.json /app/package.json

RUN npm install

RUN npm install -g @angular/cli

#RUN npm install rxjs-compat --save

RUN npm install rxjs

#RUN npm install bootstrap --save

RUN npm install bootstrap

#RUN npm install ng2-file-upload --save

RUN npm install ng2-file-upload

RUN npm install -g @angular/material

#RUN npm install express multer body-parser dotenv --save

RUN npm install express multer body-parser dotenv

#RUN npm install nodemon --save-dev

RUN npm install -g nodemon

RUN npm run build --prod

#RUN npm nodemon server

CMD ["nodemon", "/app/server.js"]

FROM nginx:latest

COPY --from=builder /app/dist/ng8fileupload /usr/share/nginx/html
  

Я могу запустить проект angular, но никогда не смогу запустить server.js . Прерывается загрузка приложения. Если я попытаюсь запустить сервер nodemon через командную строку, все будет работать. Что я делаю не так при запуске nodmon?

Комментарии:

1. Серверная служба должна запускаться в отдельном контейнере. Содержимое образа Docker фиксируется после его создания; вы должны иметь возможность устанавливать CMD ["node", "/app/server.js"] без установки nodemon или аналогичных инструментов только для разработки.

2. Так вы имеете в виду, что я создаю отдельный образ для server.js и запустить его ?

3. Когда вы запускали серверный код локально, вы собирали его с помощью npm run build —prod или npm run build?

4. Также попробуйте запустить серверный контейнер отдельно, т.Е. Удалить зависимости внешнего интерфейса. Поделитесь журналами контейнера для любых ошибок

5. Спасибо @iAviator Я попытаюсь запустить как два отдельных контейнера и вернусь.

Ответ №1:

Я бы посоветовал вам разделить ваш код на внешние и внутренние компоненты. Таким образом, ваш внутренний код будет находиться в папке серверной части, а внешний код будет находиться в папке внешнего интерфейса. Для каждого файла Dockerfile будет отдельный файл Dockerfile во интерфейсной и серверной папках. Теперь для сборки контейнеров используйте файл Docker compose, который будет находиться в корневом каталоге вашего проекта. Проверьте пример здесь https://github.com/wkrzywiec/kanban-board/blob/master/docker-compose.yml

Комментарии:

1. Запуск как внешнего интерфейса, так и серверной части через файл yml решил актуальную проблему связывания обоих контейнеров.