node.js - 在 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-mongo
ORM 适配器有关。第二个似乎是连接到数据库的问题。所以我不确定第一个问题是否是一个红鲱鱼,其根本问题是缺乏数据库连接。
如果有人对如何在 Docker 容器中运行 Sails.js 应用程序并访问机器localhost
和 MongoDB 有任何建议,我希望能得到一些帮助!
解决方案
除了--network host
在docker run
命令中,您还需要在连接属性中定义主机的 IP 而不是localhost
,因为容器中的 localhost 指的是容器本身。如果您想让代码中的连接属性保持一致,您可以让每个开发人员在 中设置一个环回别名/etc/hosts
,例如127.0.0.1 my.host.com
,并将连接属性设置为该主机名(“my.host.com”),例如my.host.com:27017
MongoDB。
推荐阅读
- perl - 使用 perl 对数字进行舍入
- asp.net - 谷歌recaptcha第二次不起作用
- amazon-web-services - 将 DynamoDB 表恢复到其他 AWS 账户的时间点
- android - 使用 top 测量 Android 应用程序中的 CPU 负载
- ffmpeg - 如何使用 ffmpeg 删除所有元数据?包括 DURATION 和 ENCODER
- sql - 执行计算,其中计算的数据在两个表之外
- kubernetes - 从“kubectl get pod”和“kubectl describe pod”命令获取不同的 Pod 状态
- c# - 无法使用 C# Net Core 5.0 连接到本地 SQL 服务器,远程工作
- svelte - 使用 Svelte 进行表格分页
- capl - 独木舟使用 2 LDF