簡體   English   中英

無法使用 docker-compose 服務的 mongoDB 進行身份驗證

[英]Can't authenticate with mongoDB from docker-compose service

我正在嘗試做的事情

我正在嘗試設置 docker-compose 定義,其中我有一個 mongoDB 容器和一個連接到它的 nodeJS 容器。

version: "3.9"

services:

  events-db:
    image: mongo
    volumes:
      - db-volume:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: $SANDBOX_DB_USER
      MONGO_INITDB_ROOT_PASSWORD: $SANDBOX_DB_PASS
      MONGO_INITDB_DATABASE: sandboxdb

  app:
    image: node:15.12.0
    user: node
    working_dir: /home/node/app
    volumes:
      - ./:/home/node/app:ro
    environment:
      MDB_CONNECTION: mongodb://$SANDBOX_DB_USER:$SANDBOX_DB_PASS@events-db:27017/sandboxdb
    command: node myapp
    depends_on:
      - events-db

volumes:
  db-volume:

連同聲明憑據的.env文件(計划在我將其部署到生產環境時使用正確的 env 變量):

SANDBOX_DB_USER=myuser
SANDBOX_DB_PASS=myp4ss

最后,我的 nodejs 腳本myapp.js只是嘗試連接、獲取對集合的引用並插入文檔:

require('dotenv').config()
const { MongoClient } = require('mongodb')

async function main () {
  console.log('Connecting')
  const client = new MongoClient(process.env.MDB_CONNECTION, {
    connectTimeoutMS: 10000,
    useUnifiedTopology: true,
  })
  await client.connect()
  const db = client.db()
  const events = db.collection('events')

  console.log('Inserting an event')
  await events.insertOne({
    type: 'foo',
    timestamp: new Date(),
  })

  console.log('Done.')
  process.exit(0)
}

if (require.main === module) {
  main()
}

結果

當我運行docker-compose config時,我看到以下 output,所以我希望它可以工作:

$ 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

我已將完整的 output 放在https://pastebin.com/uNyJ6tiy和此 repo 中的示例代碼: Z5E056C500A1C4B6A7110B50D807BADE-docker-compose-github.mon.

經過更多的挖掘,我設法弄清楚了。 問題是MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD變量只是設置了 root 用戶的憑據,而MONGO_INITDB_DATABASE只是為/docker-entrypoint-initdb.d中的腳本設置了初始數據庫。

默認情況下,root 用戶被添加到admin數據庫中,因此通過刪除連接字符串的/sandboxdb部分,我能夠讓我的節點應用程序以 root 用戶身份對admin數據庫進行身份驗證。

雖然這並不能完全實現我最初想要的(為我的數據庫創建一個單獨的非 root 用戶,並使用它來進行身份驗證),但我認為這讓我走上了使用 init 腳本設置我想擁有的用戶帳戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM