#node.js #angular #docker #npm
#node.js #угловой #docker #npm
Вопрос:
Я пишу простое приложение angular, которое использует node в качестве серверной части для загрузки файлов. Моя папка проекта как таковая:
Чтобы запустить это в Angular, я делаю
- ng serve
- Одновременно запустите «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 решил актуальную проблему связывания обоих контейнеров.