【问题标题】:Right approach writing a Dockerfile with Node as backend使用 Node 作为后端编写 Dockerfile 的正确方法
【发布时间】:2021-03-01 15:16:02
【问题描述】:

我正在编写一个简单的 Angular 应用程序,它使用节点作为文件上传的后端。我的项目文件夹是这样的:

要在 Angular 中运行它,我会这样做

  1. ng 服务
  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 时我做错了什么?

【问题讨论】:

  • 后端服务需要在单独的容器中运行。 Docker 镜像的内容一旦构建就固定了;您应该能够设置CMD ["node", "/app/server.js"],而无需安装 nodemon 或类似的仅用于开发的工具。
  • 那么你的意思是我为 server.js 制作一个单独的图像并运行它?
  • 当您在本地运行后端代码时,您是使用 npm run build --prod 还是 npm run build 构建的?
  • 还可以尝试单独运行后端容器,即删除前端依赖项。共享任何错误的容器日志
  • 谢谢@iAviator 我会尝试作为两个单独的容器运行并返回。

标签: node.js angular docker npm


【解决方案1】:

我建议您将代码模块化为前​​端和后端组件。 因此,您的后端代码将位于后端文件夹中,而前端代码将位于前端文件夹中。 前端和后端文件夹中的每个文件夹都有单独的 Dockerfile。 现在,要组装容器,请使用 Docker compose 文件,该文件将位于项目的根目录中。 在这里查看示例https://github.com/wkrzywiec/kanban-board/blob/master/docker-compose.yml

【讨论】:

  • 通过 yml 文件运行前端和后端解决了链接两个容器的实际问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多