Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Docker容器中开发Node.js应用程序_Node.js_Mongodb_Docker_Sails.js - Fatal编程技术网

在Docker容器中开发Node.js应用程序

在Docker容器中开发Node.js应用程序,node.js,mongodb,docker,sails.js,Node.js,Mongodb,Docker,Sails.js,我试图将本地开发环境设置为所有Node.js应用程序都在docker容器中开发。我们的团队在Linux、macOS和Windows上工作,因此这将有助于我们限制由此产生的一些问题 我们在节点框架中使用Sails.js,我不确定问题是在Docker设置中,还是与Sails本身有关 下面是我的docker run命令,它几乎可以工作: docker run --rm -it -p 3000:3000 --name my-app-dev -v $PWD:/home/app -w /home/app -

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

我们在节点框架中使用Sails.js,我不确定问题是在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
这几乎可以实现,但我们正在开发的应用程序需要访问某些数据库应用程序(MongoDB和SQL Server)的机器的
localhost
,以及RabbitMQ实例。SQL Server位于端口1433(在Docker中运行),RabbitMQ位于端口5672(也在Docker中运行),MongoDB位于27017,但未在Docker中运行

当我运行Docker命令然后启动应用程序时,我得到一个错误,说明应用程序无法连接到那些
localhost
端口,这从我所读到的内容来看是有意义的,因为默认情况下Docker容器有自己的
localhost
,这是默认情况下它将尝试连接的位置

因此,我在
docker run
命令中添加了以下内容:
--net=host
,希望让容器访问我机器的
本地主机。这似乎可以解决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及其
sailsmongo
ORM适配器有关。第二个问题似乎是连接数据库的问题。因此,我不确定第一个问题是否是一个转移视线的问题,其根本问题是缺少数据库连接


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

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

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

这通常非常有用,因为它将任何正在运行的Docker容器与本地网络隔离,确保只有显式打开到本地网络的端口才会公开,从而避免任何潜在冲突

但有时,Docker容器可能需要访问主机的服务

实现这一目标有两种选择:

  • 使用以下代码从容器中获取主机IP地址:
  • #从Docker容器中获取主机的IP

  • 通过运行以下命令,可以将Docker容器连接到本地网络:

    docker运行--network=“host”

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


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

    我已经尝试了这两个步骤,但无论发生什么,都会得到相同的结果。无法连接到Mongo。是否尝试使用端口公开Mongo并通过此端口访问?
    /sbin/ip route|awk '/default/ { print $3 }'