使用Docker

时间:2017-12-29 14:40:33

标签: node.js mongodb docker redis docker-compose

所以我试图使用docker-compose将我的服务器和数据库放入docker容器中。

我目前拥有的docker-compose文件:

version: "2"
services:
  api:
    build: .
    ports:
      - "3000:3000"
    command: npm run-script docker
    networks:
      - backend

  mongodb:
    image: mongo:latest
    ports:
      - "27017:27017"
    networks:
      - backend

  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    networks:
      - backend

networks:
  backend:

我连接到数据库的代码如下所示:

/**
 * Init the Redis db.
 * @returns {*|Promise}
 */
init: function (isMaster=false) {

    return new Promise(function (resolve, reject) {

        logger.logInfo('(rdb.init) Trying to connect to Redis database');
        client = redis.createClient("redis://redis:6379");

        client.on("error", err => {
            logger.logFatal('(rdb.init) Could not connect to redis database - ' + err);
            reject(err);
        });

        client.on("connect", () => {
            logger.logInfo('(rdb.init) Successfully connected to redis database');

            if (config.CLEAR_REDIS_COLLECTIONS && isMaster) {
                logger.logWarn('(rdb.init) CLEAR_REDIS_COLLECTIONS = ' + config.CLEAR_REDIS_COLLECTIONS);
                dropCollections().then(() => resolve()).catch(err => reject(err));
            } else {
                resolve();
            }
        });
    });
}

/*
 *Connect to the database
 */
function init(isMaster=false) {

    logger.logInfo('(mdb.init) Trying to connect to the database @' + config.DB_URL);

    mongoose.Promise = Promise;

    // Connect to the db
    return mongoose.connect("mongodb://mongodb:27017/stuber", {useMongoClient: true}).then(() => {
        logger.logInfo('(mdb.init) Successfully connected to the database');

        if (config.CLEAR_MONGO_COLLECTIONS && isMaster) {
            logger.logWarn('(mdb.init) CLEAR_MONGO_COLLECTIONS = ' + config.CLEAR_MONGO_COLLECTIONS);
            return dropCollections();
        } else {
            return Promise.resolve();
        }
    }, err => {
        logger.logFatal('(mdb.init) Could not connect to the database - ' + err);
        return Promise.reject(err);
    });
}

我崩溃之前从服务器获取的日志是:

  

api_1 | [2017-12-29 14:25:36.711] [信息] Stuber - [大师] ============================== ==== | v0.4.0 | ==================================   api_1 | [2017-12-29 14:25:36.770] [警告] Stuber - [Master](tokenAuth)令牌认证BYPASS = false   api_1 | [2017-12-29 14:25:38.594] [INFO] Stuber - [Master](io.createImageDirs)用户图片路径= / app / public / images / users /   api_1 | [2017-12-29 14:25:38.595] [INFO] Stuber - [Master](io.createImageDirs)车辆图片路径= / app / public / images / vehicles /   api_1 | [2017-12-29 14:25:38.595] [INFO] Stuber - [Master](io.createImageDirs)创建“public”目录   api_1 | [2017-12-29 14:25:38.596] [INFO] Stuber - [Master](io.createImageDirs)创建“images”目录   api_1 | [2017-12-29 14:25:38.596] [INFO] Stuber - [Master](io.createImageDirs)创建“users”目录   api_1 | [2017-12-29 14:25:38.597] [INFO] Stuber - [Master](io.createImageDirs)创建“车辆”目录   api_1 | [2017-12-29 14:25:38.597] [INFO] Stuber - [Master](rdb.init)试图连接到Redis数据库   api_1 | [2017-12-29 14:25:38.682] [INFO] Stuber - [Master](rdb.init)成功连接到redis数据库   api_1 | [2017-12-29 14:25:38.682] [警告] Stuber - [大师](rdb.init)CLEAR_REDIS_COLLECTIONS = true   api_1 | [2017-12-29 14:25:38.781] [INFO] Stuber - [Master](rdb.dropCollections)清除Redis数据库   api_1 | [2017-12-29 14:25:38.782] [INFO] Stuber - [Master](mdb.init)试图连接数据库@mongodb:// user:xxx @ xxx:xxx / stuber   mongodb_1 | 2017-12-29T14:25:38.808 + 0000我从172.19.0.2:33810#2接受网络[听众]连接(1个连接现已打开)   mongodb_1 | 2017-12-29T14:25:38.834 + 0000 I NETWORK [conn2]从172.19.0.2:33810 conn获取客户端元数据:{driver:{name:“nodejs”,version:“2.2.33”},os:{type :“Linux”,名称:“linux”,架构:“x64”,版本:“4.4.0-1039-aws”},平台:“Node.js v7.10.1,LE,mongodb-core:2.1.17” }   api_1 | [2017-12-29 14:25:38.847] [INFO] Stuber - [Master](mdb.init)成功连接数据库   api_1 | [2017-12-29 14:25:38.847] [INFO] Stuber - [Master](服务器)创建kue作业队列   api_1 | [2017-12-29 14:25:38.934] [INFO] Stuber - [Master](kue.init)正在分配主要工作人员处理工作   api_1 | [2017-12-29 14:25:38.947] [INFO] Stuber - [Master](server.init)从数据库中检索所有系统ID   api_1 |船尾   api_1 | events.js:163   api_1 |扔掉//未处理的'错误'事件   api_1 | ^   api_1 |   api_1 |错误:Redis连接到redis:// redis:6379失败 - getaddrinfo ENOTFOUND redis:// redis redis:// redis:6379   api_1 |在errnoException(dns.js:28:10)   api_1 |在GetAddrInfoReqWrap.onlookup [as oncomplete](dns.js:73:26)

忽略 [2017-12-29 14:25:38.782] [INFO] Stuber - [Master](mdb.init)尝试连接数据库@mongodb:// user:xxx @ xxx:xxx / stuber 因为它没有记录正确的地址,所以代码显示了它实际连接的内容。

因此,根据日志,服务器能够连接到Mongo和Redis数据库,但由于某种原因,它似乎失去了与Redis的连接。我已经尝试了各种预制的docker-compose文件,这些文件适用于Node-Mongo-Redis设置,但到目前为止还没有。任何有关这方面的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我得到了同样的错误,这解决了我的问题,也许它也可以帮助你。

$ npm info express --verbose
# Error message: npm info retry will retry, error on last attempt: 
Error: getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443
$ nslookup registry.npmjs.org
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
registry.npmjs.org  canonical name = a.sni.fastly.net.
a.sni.fastly.net    canonical name = prod.a.sni.global.fastlylb.net.
Name:   prod.a.sni.global.fastlylb.net
Address: 151.101.32.162
$ sudo vim /etc/hosts 
# Add "151.101.32.162 registry.npmjs.org` to hosts file
$ npm info express --verbose
# Works now!

原始来源:https://github.com/npm/npm/issues/6686