Pm2 不绑定 docker 个端口

Pm2 don't bind docker ports

我正在构建一个节点 api 样板文件,其中包含 docker、babel、istanbul、pm2、eslint 和其他功能。我的项目在 nodemon 的开发模式下运行良好,在 mocha 的测试模式下也运行良好。但是,当我 运行 prod 模式下的项目使用 pm2 时,docker 端口不绑定。

完整的项目可以在这里找到https://github.com/apandrade/node-api-boilerplate

Docker ps 在生产模式 运行 之后的结果

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
    3d5362284957        node:latest         "npm start"              15 seconds ago      Up 15 seconds                                  nodeapiboilerplate_provision_run_1
    a2c79e3e47cc        mongo               "docker-entrypoint.s…"   52 seconds ago      Up 51 seconds       0.0.0.0:27017->27017/tcp   mongo

Base.yml 文件

    version: "2"
    services:
      db_credentials:
        environment:
          - MONGODB_ADMIN_USER=*********
          - MONGODB_ADMIN_PASS=*********
          - MONGODB_APPLICATION_DATABASE=node_api_db
          - MONGODB_APPLICATION_USER=*********
          - MONGODB_APPLICATION_PASS=*********

      common: &common
        image: "node:latest"
        working_dir: /usr/src/app
        restart: always
        volumes:
          - ./:/usr/src/app
          - ./scripts/waitforit:/usr/bin/waitforit
        ports:
          - "3000:3000" 

      base:
        <<: *common
        environment:
          - MONGODB_ADMIN_USER=*********
          - MONGODB_ADMIN_PASS=*********
          - MONGODB_APPLICATION_DATABASE=node_api_db
          - MONGODB_APPLICATION_USER=*********
          - MONGODB_APPLICATION_PASS=*********
          - APP_NAME=node-api-boilerplate
          - PORT=3000
          - DB_HOST=mongo
          - DB_PORT=27017

      base_test:
        <<: *common
        environment:
          - MONGODB_ADMIN_USER=*********
          - MONGODB_ADMIN_PASS=*********
          - MONGODB_APPLICATION_DATABASE=node_api
          - MONGODB_APPLICATION_USER=*********
          - MONGODB_APPLICATION_PASS=*********
          - PORT=3000
          - DB_HOST=mongo
          - DB_PORT=27017

docker-compose.yml 文件

    version: "2"
    services:
      mongo:
        container_name: mongo
        image: mongo
        volumes:
          - ./data:/data/db
          - ./scripts/mongo-entrypoint.sh:/docker-entrypoint-initdb.d/mongo-entrypoint.sh
        ports:
          - "27017:27017"
        extends:
          file: base.yml
          service: db_credentials
        command: "mongod --auth"

      develop:
        extends:
          file: base.yml
          service: base
        environment:
          - NODE_ENV=development
          - LOG_LEVEL=debug
        container_name: dev_node_api
        command: "npm run dev"
        depends_on:
          - mongo   

      provision:
        extends:
          file: base.yml
          service: base
        environment:
          - NODE_ENV=production
          - LOG_LEVEL=info
        container_name: prod_node_api
        command: "npm start"
        depends_on:
          - mongo

      test:
        extends:
          file: base.yml
          service: base_test
        environment:
          - NODE_ENV=test
          - LOG_LEVEL=debug
        container_name: test_node_api
        command: "npm run test"
        depends_on:
          - mongo

process.json 文件

    {
      "apps" : [{
        "name"        : "node-api-boilerplate",
        "script"      : "./src/server.js",
        "exec_mode"   : "cluster",
        "exec_interpreter": "babel-node",
        "instances" : "max",
        "merge_logs" :true
      }]
    }

server.js 文件

    require('pretty-error').start();
    require('babel-register');// eslint-disable-line import/no-extraneous-dependencies
    const express = require('express');
    const morgan = require('morgan');
    const methodOverride = require('method-override');
    const bodyParser = require('body-parser');
    const createError = require('http-errors');
    require('./config/database');
    const router = require('./config/router');
    const logger = require('./config/logger');
    const allowCors = require('./config/cors');

    const PORT = process.env.PORT;
    const app = express();

    app.disable('x-powered-by');
    app.use(methodOverride());

    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(allowCors);

    app.use(morgan('dev', {
        skip: (req, res) => res.statusCode < 400,
        stream: process.stderr,
    }));

    app.use(morgan('dev', {
        skip: (req, res) => res.statusCode >= 400,
        stream: process.stdout,
    }));

    /**
     * Add and remove headers for all requests
     */
    app.use((req, res, next) => {
        res.setHeader('Content-Type', 'application/json');
        res.setHeader('Accept', 'application/json');
        next();
    });

    app.use('/api/v1', router);

    /**
     * Error Handler
     */
    app.use((err, req, res, next) => {
        logger.error(err.stack);
        const error = createError(err);
        res.status(error.status).json(error);
        next();
    });


    app.listen(PORT, () => {
        logger.info(`Listening on port ${PORT}`);
    });

在寻找解决方案几天后,我发现不存在任何问题,发生的是 运行 我的项目 运行 docker-compose run --rm <service_name> 并且docker撰写参考明确

the docker-compose run command does not create any of the ports specified in the service configuration. This prevents port collisions with already-open ports. If you do want the service’s ports to be created and mapped to the host, specify the --service-ports flag:

docker-compose run --service-ports <service_name>

但是我选择 运行 docker-compose up <service_name>,这对我来说已经足够了,因为我没有特定的需要如何覆盖命令或 运行 不同端口上只有一个容器.