Pm2 не связывает порты докера - PullRequest
0 голосов
/ 12 мая 2018

Я строю шаблон API узла с докером, babel, Стамбулом, pm2, eslint и другими функциями.Мой проект отлично работает в режиме разработки с nodemon и отлично работает в тестовом режиме с mocha тоже.Однако, когда я запускаю проект в режиме prod с pm2, порты докера не связываются.

Полный проект можно найти здесь 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
      }]
    }

серверфайл .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 голосов
/ 15 мая 2018

После нескольких дней в поисках решения я обнаружил, что проблем не существует, что происходит, что для запуска моего проекта я запустил docker-compose run --rm <service_name>, и ссылка на докер составления ясна

команда docker-compose run не создает ни одного из портов, указанных в конфигурации службы.Это предотвращает конфликты портов с уже открытыми портами.Если вы хотите, чтобы порты службы создавались и отображались на хосте, укажите флаг --service-ports:

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

Однако я решил запустить docker-compose up <service_name>, этого достаточно дляменя, потому что у меня нет особых потребностей, как переопределить команду или запустить только один контейнер на разных портах.

...