【问题标题】:Developing Node.js Applications Inside Docker Container在 Docker 容器中开发 Node.js 应用程序
【发布时间】:2019-09-05 16:02:58
【问题描述】:

我正在尝试将我的本地开发环境设置为我的所有 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 有任何建议,我希望能得到一些帮助!

【问题讨论】:

    标签: node.js mongodb docker sails.js


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      默认情况下,Docker 创建一个桥接网络,并为任何连接的容器和主机操作系统分配一个 IP 地址。运行 ifconfig 并搜索 docker0 接口将显示 Docker 用于网络的 IP 地址范围。

      这通常非常有用,因为它将任何正在运行的 Docker 容器与本地网络隔离开来,确保只有明确向本地网络开放的端口才会暴露,从而避免任何潜在的冲突。

      不过,在某些情况下,Docker 容器可能需要访问主机的服务。

      有两种方法可以实现这一点:

      1. 使用以下代码从容器内获取主机 IP 地址:

      #从Docker容器中获取主机IP

      /sbin/ip route|awk '/default/ { print $3 }'
      
      1. 您可以通过运行以下命令将 Docker 容器附加到本地网络:

        docker run --network="host"

      如果您使用的是 docker-compose,您可以添加一个以主机作为驱动程序的网络

      这会将容器附加到主机网络,这允许 Docker 容器通过 localhost 访问主机上运行的任何服务。它也适用于在本地网络上运行或将其端口暴露给 localhost 的任何其他 Docker 容器。

      【讨论】:

      • 我已经尝试了这两个步骤,但无论如何都会得到相同的结果。与 Mongo 的连接没有发生。
      • 您是否尝试通过端口公开mongo并通过此端口访问?
      猜你喜欢
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 2015-02-05
      • 1970-01-01
      相关资源
      最近更新 更多