首页 > 解决方案 > 在单个 Docker 容器下具有多个服务器的节点应用程序对于某些服务器/端口返回 404

问题描述

我正在尝试设置一个 Dockerised Node 应用程序,它通过 pm2-runtime 运行三个 Node 服务器。三台服务器位于一个容器中。相同的设置在 Docker 外部的 localhost 上完美运行,但我遇到了 Docker 版本(对于某些端口)返回 404 错误的问题。这是我的 Dockerfile:

FROM node:latest

# Create the workdir.
RUN mkdir /myapp
WORKDIR /myapp

# Install packages.
COPY package*.json ./
RUN npm install

# Install pm2 globally.
RUN npm install -g pm2

# Copy source code to the container.
COPY . ./

# Run the servers with pm2-runtime.
#MD ["pm2-runtime", "process.yml"]

我的 process.yml:

apps:
  - script   : ./dist/foo.js
    name     : 'foo'
    instances: 2
    env    :
      NODE_ENV: production
  - script : ./dist/bar.js
    name   : 'bar'
    instances: 2
    env    :
      NODE_ENV: production
  - script : ./dist/baz.js
    name   : 'baz'
    instances: 2
    env    :
      NODE_ENV: production

这是我的 docker-compose.yml (我确实在其中定义了其他服务,但在此示例中已将其剥离为单个服务。我仅使用此服务进行了测试,但仍然面临同样的问题):

version: "3"

services:
  myapp:
    build: .
    restart: always
    environment:
      - NODE_ENV=production
    ports:
      - "3000:3000"
      - "8080:8080"
      - "9000:9000"
    networks:
      - my-network

networks:
  my-network:

我面临的问题是,虽然我可以访问端口 3000 上的 foo 服务器,但其他服务器给我一个 404。值得注意的是,bar 和 baz 服务器是通过 axios 调用访问的。但是我不明白为什么他们在本地运行没有问题时返回404错误。有问题的资源也在我的静态文件夹的子文件夹中。

会发生什么?我的 docker-compose 端口定义有问题吗?

标签: node.jsdockerdocker-composepm2

解决方案


我认为您必须为每个 Node 应用程序提供服务。

services:
foo:
  build: .
  restart: always
  environment:
    - NODE_ENV=production
  ports:
    - "3000:3000"
bar:
  build: .
  restart: always
  environment:
    - NODE_ENV=production
  ports:
    - "8080:8080"
baz:
  build: .
  restart: always
  environment:
    - NODE_ENV=production
  ports:
    - "9000:9000"

推荐阅读