【问题标题】:How do I serve my mern app in production with docker using nginx?如何使用 nginx 在生产环境中使用 docker 服务我的 mern 应用程序?
【发布时间】:2020-09-05 23:42:49
【问题描述】:

我正在尝试在生产中使用 nginx 为我的 mern stack 应用程序提供服务。我有一个 Dockerfile:

# build environment
FROM node:13.12.0-alpine as build
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY package.json ./
RUN npm install
COPY . ./
RUN npm run build

# production environment
FROM nginx:stable-alpine
COPY --from=build app/dist/ /usr/share/nginx/html
# new
COPY nginx/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

一个 docker-compose.yml:

version: '3.7'

services:

  web:
    container_name: web
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - '.:/app'
      - '/app/node_modules'
    ports:
      - 3001:3000
    environment:
      - CHOKIDAR_USEPOLLING=true
    depends_on: 
      - mongo

  mongo:
    image: mongo
    volumes:
      - data:/data/db
    ports:
      - "27017:27017"

volumes: 
  node_modules:
  data:

这是我的 package.json 的脚本部分

  "scripts": {
    "development": "nodemon",
    "build": "webpack --config webpack.config.client.production.js && webpack --mode=production --config webpack.config.server.js",
    "start": "NODE_ENV=production node ./dist/server.generated.js"
  },

但是,当我启动容器时,只有 docker-compose 日志适用于 mongo,而 nginx 仅显示默认页面。 这是我的 nginx.conf

server {

  listen 80;

  location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
  }

  error_page   500 502 503 504  /50x.html;

  location = /50x.html {
    root   /usr/share/nginx/html;
  }

}

注意:此设置在我使用 create react app 时有效(只是我用 build 替换了 dist)。该项目使用服务器端渲染。我不知道我做错了什么,但我肯定会感激任何想法。项目位于:https://github.com/smeyerhot/mern-market 唯一不同的是docker-compose、Dockerfile和nginx/nginx.conf文件。

【问题讨论】:

    标签: reactjs docker nginx webpack mern


    【解决方案1】:

    实际上,您尝试提供 nodejs 应用程序而不是静态应用程序。这就是你不需要 nginx 服务器的原因。

    我认为您应该将 Dockerfile 更改为:

    FROM node:13.12.0-alpine as build
    WORKDIR /app
    ENV PATH /app/node_modules/.bin:$PATH
    COPY package.json ./
    RUN npm install
    COPY . ./
    RUN npm run build
    CMD npm run start
    

    这里唯一的问题是,您将拥有镜像上的所有构建依赖项。

    【讨论】:

    • 感谢您的回答。通过 nginx 提供静态资产不是优势吗?当我在本地运行时,我使用节点来提供反应。我想如果我有一个单独的后端和前端,我只会使用 nginx? IE。两个独立的进程。
    • 你可以使用 nginx 来提供静态内容,但在这里,它不仅仅是静态内容,因为 nodejs 进程会做一些服务器端渲染。
    猜你喜欢
    • 2018-05-15
    • 2019-09-27
    • 2022-08-18
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2023-03-28
    相关资源
    最近更新 更多