Pm2不绑定docker端口

时间:2018-05-12 01:27:01

标签: node.js docker docker-compose pm2

我正在使用docker,babel,istanbul,pm2,eslint和其他功能构建节点api样板。我的项目在devmon模式下使用nodemon工作正常,并且在mocha的测试模式下工作正常。但是,当我使用pm2以prod模式运行项目时,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 file

    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}`);
    });

1 个答案:

答案 0 :(得分:0)

在搜索解决方案几天后,我发现不存在任何问题,运行我的项目的情况是我运行docker-compose run --service-ports <service_name> 并且docker撰写引用是明确的

  

docker-compose run命令不会创建服务配置中指定的任何端口。这可以防止端口与已打开的端口发生冲突。如果您确实希望创建服务的端口并将其映射到主机,请指定--service-ports标志:

docker-compose up <service_name>

但是我选择运行import { Component } from '@angular/core'; import { AngularFireAuth } from 'angularfire2/auth'; import { ToastController } from 'ionic-angular'; import { Account } from '../../models/accounts/account.interface'; @Component({ selector: 'app-register-form', templateUrl: 'register-form.component.html' }) export class RegisterFormComponent { account = {} as Account; constructor(private afAuth: AngularFireAuth, private toast: ToastController) { } async register() { try{ const result = await this.afAuth.auth.createUserWithEmailAndPassword(this.account.email, this.account.password); this.toast.create({ message: "Account succesfully created!!", duration: 3000 }).present(); console.log(result); } catch(e){ console.error(e); this.toast.create({ message: e.message, duration: 3000 }).present(); } } } ,这对我来说已经足够了,因为我没有特定的需求如何覆盖命令或在不同的端口上只运行一个容器。