Node.js 在NGNIX中托管expressjsapi

Node.js 在NGNIX中托管expressjsapi,node.js,docker,express,nginx,Node.js,Docker,Express,Nginx,我正在努力使用DockerFile在NGINX上托管我的ExpressJSAPI 这是我的文件 FROM node:13.2.0-alpine as build WORKDIR /app ENV PATH /app/node_modules/.bin:$PATH ENV NODE_ENV = production COPY package*.json ./ RUN npm install COPY ./bin ./bin COPY ./src ./src COPY ./index.js

我正在努力使用DockerFile在NGINX上托管我的ExpressJSAPI

这是我的文件

FROM node:13.2.0-alpine as build

WORKDIR /app

ENV PATH /app/node_modules/.bin:$PATH
ENV NODE_ENV = production

COPY package*.json ./

RUN npm install

COPY ./bin ./bin
COPY ./src ./src
COPY ./index.js .

#production environment
FROM node:13.2.0-alpine as production
RUN rm /etc/nginx/conf.d/nginx.conf
COPY nginx/nginx.conf /etc/nginx/conf.d
EXPOSE 443

CMD ["nginx", "-g", "daemon off;"]
这将部署容器,但我可以ping它,因为应用程序尚未启动。目前,它可以在没有web服务器的情况下使用此命令
CMD[“npm”,“start”]

如何同时启动nginx服务器和节点服务

这是我的节点:

"scripts": {
    "dev": "nodemon --exec babel-node ./bin/www",
    "start": "node ./bin/www"
  },
ngnix配置:

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main;
    sendfile on;
    keepalive_timeout 65;   
    gzip on;
    server {
        listen 80;

        location / {
            proxy_pass http://localhost:3000/;
        }
    }
}

您可以创建一个文件,例如
start\u services.sh
,并使用docker
CDM
执行它。文件内容示例:

#/bin/bash
cd你的目录
nginx&npm运行启动

在这种情况下,两个服务将从一个docker容器启动并运行。

您试图做的事情与集装箱化的想法背道而驰。如果确实希望在单个容器中同时运行
express
(api)和
nginx
(代理),可以尝试创建bash脚本,该脚本将同时运行这两个脚本,并将其作为
Dockerfile
中的
入口点。(见安德烈的回答)

然而,这不是我建议你做的。相反,最好在单独的容器中运行它们(例如通过
docker compose
在本地测试),并允许它们通过网络进行通信。这将要求您将
Dockerfile
拆分为两个单独的配置

原料药

代理


这样,您可以将它们作为两个容器运行,其中
nginx
将公开端口80和
express
公开端口3000。更好的解决方案是创建
docker compose
配置并自动执行大量代码(您不需要创建单独的nginx docker映像,只需使用带有已装入卷的标准映像即可)。关于如何操作,请参阅

,这通常是通过两个单独的容器完成的。
FROM node:13.2.0-alpine

WORKDIR /app

ENV PATH /app/node_modules/.bin:$PATH
ENV NODE_ENV = production

COPY package*.json ./

RUN npm install

COPY ./bin ./bin
COPY ./src ./src
COPY ./index.js .
CMD ["npm", "start"]
FROM nginx
RUN rm /etc/nginx/conf.d/nginx.conf
COPY nginx/nginx.conf /etc/nginx/conf.d