首页 > 解决方案 > 在 Docker 容器中开发 Node.js 应用程序

问题描述

我正在尝试将我的本地开发环境设置为我的所有 Node.js 应用程序都在 docker 容器中开发。我们的团队在 Linux、macOS 和 Windows 上工作,因此这应该有助于我们限制我们看到的一些问题。

我们将 Sails.js 用于我们的 Node 框架,我不确定问题是在我的 Docker 设置中,还是 Sails 本身的问题。

这是我的docker run命令,几乎可以正常工作:

docker run --rm -it -p 3000:3000 --name my-app-dev -v $PWD:/home/app -w /home/app -u node node:latest /bin/bash

这几乎可以工作,但是我们正在开发的应用程序需要访问机器的localhost某些数据库应用程序(MongoDB 和 SQL Server)和 RabbitMQ 实例。SQL Server 在端口 1433(在 Docker 中运行),RabbitMQ 在端口 5672(也在 Docker 中运行),MongoDB 在 27017 上,但不在 Docker 中运行。

当我运行该 Docker 命令然后启动应用程序时,我收到一条错误消息,指出应用程序无法连接到这些localhost端口,这从我所阅读的内容来看是有道理的,因为默认情况下 docker 容器有自己localhost的尝试默认连接。

因此,我在docker run命令中添加了以下内容:--net=host,希望让容器可以访问我机器的localhost. 这似乎摆脱了 RabbitMQ 的问题,但不是 MongoDB。控制台中有两个错误:

2019-09-05 15:58:38.800 | error | error: Could not tear down the ORM hook.  Error details: Error: Consistency violation: Attempting to tear down a datastore (`myMongoTable`) which is not currently registered with this adapter.  This is usually due to a race condition in userland code (e.g. attempting to tear down the same ORM instance more than once), or it could be due to a bug in this adapter.  (If you get stumped, reach out at http://sailsjs.com/support.)
    at Object.teardown (/home/app/node_modules/sails-mongo/lib/index.js:390:19)
    at /home/app/node_modules/waterline/lib/waterline.js:758:27
    at /home/app/node_modules/waterline/node_modules/async/dist/async.js:3047:20
    at eachOfArrayLike (/home/app/node_modules/waterline/node_modules/async/dist/async.js:1002:13)
    at eachOf (/home/app/node_modules/waterline/node_modules/async/dist/async.js:1052:9)
    at Object.eachLimit (/home/app/node_modules/waterline/node_modules/async/dist/async.js:3111:7)
    at Object.teardown (/home/app/node_modules/waterline/lib/waterline.js:742:11)
    at Hook.teardown (/home/app/node_modules/sails-hook-orm/index.js:246:30)
    at Sails.wrapper (/home/app/node_modules/@sailshq/lodash/lib/index.js:3275:19)
    at Object.onceWrapper (events.js:291:20)
    at Sails.emit (events.js:203:13)
    at Sails.emitter.emit (/home/app/node_modules/sails/lib/app/private/after.js:56:26)
    at /home/app/node_modules/sails/lib/app/lower.js:67:11
    at beforeShutdown (/home/app/node_modules/sails/lib/app/lower.js:45:12)
    at Sails.lower (/home/app/node_modules/sails/lib/app/lower.js:49:3)
    at Sails.wrapper [as lower] (/home/app/node_modules/@sailshq/lodash/lib/index.js:3275:19)
    at whenSailsIsReady (/home/app/node_modules/sails/lib/app/lift.js:68:13)
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:3861:9
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:421:16
    at iterateeCallback (/home/app/node_modules/sails/node_modules/async/dist/async.js:924:17)
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:906:16
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:3858:13
    at /home/app/node_modules/sails/lib/app/load.js:261:22
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:421:16
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:1609:17
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:906:16
    at /home/app/node_modules/sails/lib/app/load.js:186:25
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:3861:9
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:421:16
    at iterateeCallback (/home/app/node_modules/sails/node_modules/async/dist/async.js:924:17)
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:906:16
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:3858:13
    at afterwards (/home/app/node_modules/sails/lib/app/private/loadHooks.js:350:27)
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:3861:9
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:421:16
    at iterateeCallback (/home/app/node_modules/sails/node_modules/async/dist/async.js:924:17)
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:906:16
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:3858:13
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:421:16
    at iteratorCallback (/home/app/node_modules/sails/node_modules/async/dist/async.js:996:13)
    at /home/app/node_modules/sails/node_modules/async/dist/async.js:906:16
    at /home/app/node_modules/sails/lib/app/private/loadHooks.js:233:40
    at processTicksAndRejections (internal/process/task_queues.js:75:11)
2019-09-05 15:58:38.802 | verbose | verbo: (The error above was logged like this because `sails.hooks.orm.teardown()` encountered an error in a code path where it was invoked without providing a callback.)
2019-09-05 15:58:38.808 | error | error: Failed to lift app: Error: Consistency violation: Unexpected error creating db connection manager:

MongoError: failed to connect to server [localhost:27017] on first connect [Error: connect ECONNREFUSED 127.0.0.1:27017
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1056:14) {
name: 'MongoError',
message: 'connect ECONNREFUSED 127.0.0.1:27017'
}]
    at flaverr (/home/app/node_modules/flaverr/index.js:94:15)
    at Function.module.exports.parseError (/home/app/node_modules/flaverr/index.js:371:12)
    at Function.handlerCbs.error (/home/app/node_modules/machine/lib/private/help-build-machine.js:665:56)
    at connectCb (/home/app/node_modules/sails-mongo/lib/private/machines/create-manager.js:130:22)
    at connectCallback (/home/app/node_modules/sails-mongo/node_modules/mongodb/lib/mongo_client.js:428:5)
    at /home/app/node_modules/sails-mongo/node_modules/mongodb/lib/mongo_client.js:335:11
    at processTicksAndRejections (internal/process/task_queues.js:75:11)

    at Object.error (/home/app/node_modules/sails-mongo/lib/index.js:268:21)
    at /home/app/node_modules/machine/lib/private/help-build-machine.js:1514:39
    at proceedToFinalAfterExecLC (/home/app/node_modules/parley/lib/private/Deferred.js:1153:14)
    at proceedToInterceptsAndChecks (/home/app/node_modules/parley/lib/private/Deferred.js:913:12)
    at proceedToAfterExecSpinlocks (/home/app/node_modules/parley/lib/private/Deferred.js:845:10)
    at /home/app/node_modules/parley/lib/private/Deferred.js:303:7
    at /home/app/node_modules/machine/lib/private/help-build-machine.js:952:35
    at Function.handlerCbs.error (/home/app/node_modules/machine/lib/private/help-build-machine.js:742:26)
    at connectCb (/home/app/node_modules/sails-mongo/lib/private/machines/create-manager.js:130:22)
    at connectCallback (/home/app/node_modules/sails-mongo/node_modules/mongodb/lib/mongo_client.js:428:5)
    at /home/app/node_modules/sails-mongo/node_modules/mongodb/lib/mongo_client.js:335:11
    at processTicksAndRejections (internal/process/task_queues.js:75:11)

第一个问题似乎与 Sails.js 及其sails-mongoORM 适配器有关。第二个似乎是连接到数据库的问题。所以我不确定第一个问题是否是一个红鲱鱼,其根本问题是缺乏数据库连接。

如果有人对如何在 Docker 容器中运行 Sails.js 应用程序并访问机器localhost和 MongoDB 有任何建议,我希望能得到一些帮助!

标签: node.jsmongodbdockersails.js

解决方案


除了--network hostdocker run命令中,您还需要在连接属性中定义主机的 IP 而不是localhost,因为容器中的 localhost 指的是容器本身。如果您想让代码中的连接属性保持一致,您可以让每个开发人员在 中设置一个环回别名/etc/hosts,例如127.0.0.1 my.host.com,并将连接属性设置为该主机名(“my.host.com”),例如my.host.com:27017MongoDB。


推荐阅读