Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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
Node.js Can';t从docker compose服务向mongoDB进行身份验证 我想做什么_Node.js_Mongodb_Docker_Authentication_Docker Compose - Fatal编程技术网

Node.js Can';t从docker compose服务向mongoDB进行身份验证 我想做什么

Node.js Can';t从docker compose服务向mongoDB进行身份验证 我想做什么,node.js,mongodb,docker,authentication,docker-compose,Node.js,Mongodb,Docker,Authentication,Docker Compose,我正在尝试设置docker compose定义,其中有一个mongoDB容器和一个连接到它的nodeJS容器 版本:“3.9” 服务: 事件数据库: 图片:mongo 卷数: -db音量:/data/db 环境: MONGO_INITDB_ROOT_用户名:$SANDBOX_DB_用户 MONGO_INITDB_ROOT_密码:$SANDBOX_DB_PASS MONGO_INITDB_数据库:sandboxdb 应用程序: 图像:节点:15.12.0 用户:节点 工作目录:/home/node

我正在尝试设置docker compose定义,其中有一个mongoDB容器和一个连接到它的nodeJS容器

版本:“3.9”
服务:
事件数据库:
图片:mongo
卷数:
-db音量:/data/db
环境:
MONGO_INITDB_ROOT_用户名:$SANDBOX_DB_用户
MONGO_INITDB_ROOT_密码:$SANDBOX_DB_PASS
MONGO_INITDB_数据库:sandboxdb
应用程序:
图像:节点:15.12.0
用户:节点
工作目录:/home/node/app
卷数:
-./:/home/node/app:ro
环境:
MDB_连接:mongodb://$SANDBOX_数据库用户:$SANDBOX_数据库_PASS@events-db:27017/沙盒db
命令:node myapp
取决于:
-事件数据库
卷数:
db音量:
以及声明凭据的
.env
文件(计划在将其部署到生产环境时使用适当的env变量):

最后,我的nodejs脚本,
myapp.js
只是尝试连接、获取对集合的引用并插入文档:

require('dotenv').config()
const{MongoClient}=require('mongodb')
异步函数main(){
console.log('正在连接')
const client=new MongoClient(process.env.MDB_连接{
连接超时:10000,
useUnifiedTopology:正确,
})
等待client.connect()
const db=client.db()
const events=db.collection('events')
console.log('插入事件')
等待事件发生({
键入:“foo”,
时间戳:新日期(),
})
console.log('Done'))
进程。退出(0)
}
if(require.main==模块){
main()
}
结果 当我运行
docker compose config
时,我会看到以下输出,因此我希望它能正常工作:

$ docker-compose config
services:
  app:
    command: node myapp
    depends_on:
      events-db:
        condition: service_started
    environment:
      MDB_CONNECTION: mongodb://myuser:myp4ss@events-db:27017/sandboxdb
    image: node:15.12.0
    user: node
    volumes:
    - C:\workspace\dcsandbox:/home/node/app:ro
    working_dir: /home/node/app
  events-db:
    environment:
      MONGO_INITDB_DATABASE: sandboxdb
      MONGO_INITDB_ROOT_PASSWORD: myp4ss
      MONGO_INITDB_ROOT_USERNAME: myuser
    image: mongo
    volumes:
    - db-volume:/data/db:rw
version: '3.9'
volumes:
  db-volume: {}
但是,当我运行
docker compose up
时,我发现我的节点容器无法连接到mongoDB以插入事件:

events-db_1  | {"t":{"$date":"2021-04-07T13:57:36.793+00:00"},"s":"I",  "c":"NETWORK",  "id":23016,   "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"off"}}
app_1        | Connecting
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.811+00:00"},"s":"I",  "c":"NETWORK",  "id":22943,   "ctx":"listener","msg":"Connection accepted","attr":{"remote":"172.27.0.3:34164","connectionId":1,"connectionCount":1}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.816+00:00"},"s":"I",  "c":"NETWORK",  "id":51800,   "ctx":"conn1","msg":"client metadata","attr":{"remote":"172.27.0.3:34164","client":"conn1","doc":{"driver":{"name":"nodejs","version":"3.6.6"},"os":{"type":"Linux","name":"linux","architecture":"x64","version":"4.19.128-microsoft-standard"},"platform":"'Node.js v15.12.0, LE (unified)"}}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.820+00:00"},"s":"I",  "c":"NETWORK",  "id":22943,   "ctx":"listener","msg":"Connection accepted","attr":{"remote":"172.27.0.3:34166","connectionId":2,"connectionCount":2}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.822+00:00"},"s":"I",  "c":"NETWORK",  "id":51800,   "ctx":"conn2","msg":"client metadata","attr":{"remote":"172.27.0.3:34166","client":"conn2","doc":{"driver":{"name":"nodejs","version":"3.6.6"},"os":{"type":"Linux","name":"linux","architecture":"x64","version":"4.19.128-microsoft-standard"},"platform":"'Node.js v15.12.0, LE (unified)"}}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.822+00:00"},"s":"I",  "c":"ACCESS",   "id":20251,   "ctx":"conn2","msg":"Supported SASL mechanisms requested for unknown user","attr":{"user":"myuser@sandboxdb"}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.823+00:00"},"s":"I",  "c":"ACCESS",   "id":20249,   "ctx":"conn2","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-256","principalName":"myuser","authenticationDatabase":"sandboxdb","client":"172.27.0.3:34166","result":"UserNotFound: Could not find user \"myuser\" for db \"sandboxdb\""}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.824+00:00"},"s":"I",  "c":"ACCESS",   "id":20249,   "ctx":"conn2","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-1","principalName":"myuser","authenticationDatabase":"sandboxdb","client":"172.27.0.3:34166","result":"UserNotFound: Could not find user \"myuser\" for db \"sandboxdb\""}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.826+00:00"},"s":"I",  "c":"NETWORK",  "id":22944,   "ctx":"conn1","msg":"Connection ended","attr":{"remote":"172.27.0.3:34164","connectionId":1,"connectionCount":1}}
app_1        | /home/node/app/node_modules/mongodb/lib/cmap/connection.js:268
app_1        |           callback(new MongoError(document));
app_1        |                    ^
app_1        |
app_1        | MongoError: Authentication failed.
app_1        |     at MessageStream.messageHandler (/home/node/app/node_modules/mongodb/lib/cmap/connection.js:268:20)
app_1        |     at MessageStream.emit (node:events:369:20)
app_1        |     at processIncomingData (/home/node/app/node_modules/mongodb/lib/cmap/message_stream.js:144:12)
app_1        |     at MessageStream._write (/home/node/app/node_modules/mongodb/lib/cmap/message_stream.js:42:5)
app_1        |     at writeOrBuffer (node:internal/streams/writable:395:12)
app_1        |     at MessageStream.Writable.write (node:internal/streams/writable:340:10)
app_1        |     at Socket.ondata (node:internal/streams/readable:750:22)
app_1        |     at Socket.emit (node:events:369:20)
app_1        |     at addChunk (node:internal/streams/readable:313:12)
app_1        |     at readableAddChunk (node:internal/streams/readable:288:9) {
app_1        |   ok: 0,
app_1        |   code: 18,
app_1        |   codeName: 'AuthenticationFailed'
app_1        | }
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.832+00:00"},"s":"I",  "c":"NETWORK",  "id":22944,   "ctx":"conn2","msg":"Connection ended","attr":{"remote":"172.27.0.3:34166","connectionId":2,"connectionCount":0}}
dcsandbox_app_1 exited with code 1
我已将全部输出放在
这个回购协议的示例代码:

经过进一步的挖掘,我终于找到了答案。问题是
MONGO\u INITDB\u ROOT\u用户名
MONGO\u INITDB\u ROOT\u密码
变量只是设置ROOT用户的凭据,
MONGO\u INITDB\u数据库
只是为
/docker entrypoint INITDB.d
中的脚本设置初始数据库

默认情况下,根用户被添加到
admin
数据库中,因此通过删除连接字符串的
/sandboxdb
部分,我能够让我的节点应用程序以根用户身份对
admin
数据库进行身份验证


虽然这并不能完全实现我最初想要的(为我的数据库创建一个单独的非root用户,并使用它进行身份验证),我认为这使我走上了正确的道路,可以使用init脚本来设置我想要的用户帐户。

当我在节点脚本中记录
process.env.MDB_connection
时,尝试编写控制台连接字符串,我看到docker compose的以下输出:
app|u 1 |连接到mongodb://myuser:myp4ss@事件数据库:27017/sandboxdb
events-db_1  | {"t":{"$date":"2021-04-07T13:57:36.793+00:00"},"s":"I",  "c":"NETWORK",  "id":23016,   "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"off"}}
app_1        | Connecting
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.811+00:00"},"s":"I",  "c":"NETWORK",  "id":22943,   "ctx":"listener","msg":"Connection accepted","attr":{"remote":"172.27.0.3:34164","connectionId":1,"connectionCount":1}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.816+00:00"},"s":"I",  "c":"NETWORK",  "id":51800,   "ctx":"conn1","msg":"client metadata","attr":{"remote":"172.27.0.3:34164","client":"conn1","doc":{"driver":{"name":"nodejs","version":"3.6.6"},"os":{"type":"Linux","name":"linux","architecture":"x64","version":"4.19.128-microsoft-standard"},"platform":"'Node.js v15.12.0, LE (unified)"}}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.820+00:00"},"s":"I",  "c":"NETWORK",  "id":22943,   "ctx":"listener","msg":"Connection accepted","attr":{"remote":"172.27.0.3:34166","connectionId":2,"connectionCount":2}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.822+00:00"},"s":"I",  "c":"NETWORK",  "id":51800,   "ctx":"conn2","msg":"client metadata","attr":{"remote":"172.27.0.3:34166","client":"conn2","doc":{"driver":{"name":"nodejs","version":"3.6.6"},"os":{"type":"Linux","name":"linux","architecture":"x64","version":"4.19.128-microsoft-standard"},"platform":"'Node.js v15.12.0, LE (unified)"}}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.822+00:00"},"s":"I",  "c":"ACCESS",   "id":20251,   "ctx":"conn2","msg":"Supported SASL mechanisms requested for unknown user","attr":{"user":"myuser@sandboxdb"}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.823+00:00"},"s":"I",  "c":"ACCESS",   "id":20249,   "ctx":"conn2","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-256","principalName":"myuser","authenticationDatabase":"sandboxdb","client":"172.27.0.3:34166","result":"UserNotFound: Could not find user \"myuser\" for db \"sandboxdb\""}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.824+00:00"},"s":"I",  "c":"ACCESS",   "id":20249,   "ctx":"conn2","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-1","principalName":"myuser","authenticationDatabase":"sandboxdb","client":"172.27.0.3:34166","result":"UserNotFound: Could not find user \"myuser\" for db \"sandboxdb\""}}
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.826+00:00"},"s":"I",  "c":"NETWORK",  "id":22944,   "ctx":"conn1","msg":"Connection ended","attr":{"remote":"172.27.0.3:34164","connectionId":1,"connectionCount":1}}
app_1        | /home/node/app/node_modules/mongodb/lib/cmap/connection.js:268
app_1        |           callback(new MongoError(document));
app_1        |                    ^
app_1        |
app_1        | MongoError: Authentication failed.
app_1        |     at MessageStream.messageHandler (/home/node/app/node_modules/mongodb/lib/cmap/connection.js:268:20)
app_1        |     at MessageStream.emit (node:events:369:20)
app_1        |     at processIncomingData (/home/node/app/node_modules/mongodb/lib/cmap/message_stream.js:144:12)
app_1        |     at MessageStream._write (/home/node/app/node_modules/mongodb/lib/cmap/message_stream.js:42:5)
app_1        |     at writeOrBuffer (node:internal/streams/writable:395:12)
app_1        |     at MessageStream.Writable.write (node:internal/streams/writable:340:10)
app_1        |     at Socket.ondata (node:internal/streams/readable:750:22)
app_1        |     at Socket.emit (node:events:369:20)
app_1        |     at addChunk (node:internal/streams/readable:313:12)
app_1        |     at readableAddChunk (node:internal/streams/readable:288:9) {
app_1        |   ok: 0,
app_1        |   code: 18,
app_1        |   codeName: 'AuthenticationFailed'
app_1        | }
events-db_1  | {"t":{"$date":"2021-04-07T13:57:38.832+00:00"},"s":"I",  "c":"NETWORK",  "id":22944,   "ctx":"conn2","msg":"Connection ended","attr":{"remote":"172.27.0.3:34166","connectionId":2,"connectionCount":0}}
dcsandbox_app_1 exited with code 1