我正在嘗試連接到 mongodb 實體(db容器),但每次都會出現此錯誤:
MongoServerError:身份驗證失敗。
這是我的docker-compose.yml:
version: '3'
services:
app:
container_name: ${APP_NAME}_app
build:
context: .
ports:
- "8088:3001"
depends_on:
- db
environment:
- DB_HOST=db
- DB_PORT=${DB_PORT}
- DB_NAME=${DB_NAME}
- DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD}
db:
container_name: ${APP_NAME}_db
image: mongo
volumes:
- ./data:/data/db
ports:
- "${DB_PORT}:${DB_PORT}"
environment:
- MONGO_INITDB_ROOT_USERNAME=${DB_USER}
- MONGO_INITDB_ROOT_PASSWORD=${DB_PASSWORD}
- MONGO_INITDB_DATABASE=${DB_NAME}
這些是 內的變數.env:
DB_PORT=27017
DB_NAME=mydb
DB_USER=root
DB_PASSWORD=mypwd
這是連接類:
import * as Mongoose from 'mongoose'
import { UserModel } from './users/users.model'
import { ChatModel } from './chats/chats.model'
import { MessageModel } from './messages/messages.model'
const {
DB_HOST,
DB_PORT,
DB_NAME,
DB_USER,
DB_PASSWORD
} = process.env
if (!DB_HOST) throw new TypeError('DB_HOST missing!')
if (!DB_PORT) throw new TypeError('DB_PORT missing!')
if (!DB_NAME) throw new TypeError('DB_NAME missing!')
if (!DB_USER) throw new TypeError('DB_USER missing!')
if (!DB_PASSWORD) throw new TypeError('DB_PASSWORD missing!')
let database: Mongoose.Connection
export const connect = (callback: Function) => {
const uri = `mongodb://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?authSource=admin`
if (database) {
return
}
Mongoose.connect(uri)
database = Mongoose.connection
database.once('open', async () => {
console.log('Connected to database')
callback()
})
database.on('error', () => {
console.log('Error connecting to database')
})
return {
UserModel,
ChatModel,
MessageModel
}
}
export const disconnect = () => {
if (!database) {
return
}
Mongoose.disconnect()
}
這是正在運行的容器的串列:

應用程式容器沒有運行,因為存在連接錯誤,但 mongodb 容器實際上正在運行。
我做錯了什么?
uj5u.com熱心網友回復:
我創建了以下內容docker-compose.yaml以嘗試重現您的問題:
version: "3"
services:
db:
container_name: ${APP_NAME}_db
image: mongo
ports:
- "${DB_PORT}:${DB_PORT}"
environment:
- MONGO_INITDB_ROOT_USERNAME=${DB_USER}
- MONGO_INITDB_ROOT_PASSWORD=${DB_PASSWORD}
- MONGO_INITDB_DATABASE=${DB_NAME}
client:
container_name: ${APP_NAME}_client
image: mongo
command: sleep inf
environment:
- DB_HOST=db
- DB_PORT=${DB_PORT}
- DB_NAME=${DB_NAME}
- DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD}
我正在使用.env您在問題中顯示的檔案,并添加了APP_NAME變數:
DB_PORT=27017
DB_NAME=mydb
DB_USER=root
DB_PASSWORD=mypwd
APP_NAME=example
如果我調出堆疊,然后docker exec進入客戶端容器并運行:
root@4c7dd638c102:/# mongosh mongodb://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?authSource=admin
它似乎作業得很好:
Current Mongosh Log ID: 62a79256b9719bd467e22d03
Connecting to: mongodb://<credentials>@db:27017/mydb?authSource=admin&directConnection=true
Using MongoDB: 5.0.0
Using Mongosh: 1.0.0
...
mydb>
您是否驗證(例如通過列印出來)uri您的 javascript 代碼中的變數包含您期望的值?
如果我更新我的復制器以使用命名卷,像這樣......
version: "3"
services:
db:
container_name: ${APP_NAME}_db
image: mongo
ports:
- "${DB_PORT}:${DB_PORT}"
volumes:
- "mongo_data:/data/db"
environment:
- MONGO_INITDB_ROOT_USERNAME=${DB_USER}
- MONGO_INITDB_ROOT_PASSWORD=${DB_PASSWORD}
- MONGO_INITDB_DATABASE=${DB_NAME}
client:
container_name: ${APP_NAME}_client
image: mongo
command: sleep inf
environment:
- DB_HOST=db
- DB_PORT=${DB_PORT}
- DB_NAME=${DB_NAME}
- DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD}
volumes:
mongo_data:
...一切都繼續正常作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/490021.html
