【发布时间】:2020-05-07 14:01:11
【问题描述】:
我正在尝试在我现有的项目中使用 docker。我有两个额外的服务,redis 和 mongodb。我在创建用户和验证该用户以能够使用数据库时遇到问题。我不想通过运行容器(docker exec -it ...)并创建用户并在那里授予权限来做到这一点。这样每个开发人员都必须在他们的机器上进行。相反,我希望在创建 mongodb 图像时运行脚本。
这是我的尝试
const {
DATABASE_HOST,
DATABASE_PORT,
DATABASE_DBNAME,
DATABASE_DBUSER,
DATABASE_DBPASS,
} = require('../configs');
console.log('DATABASE', DATABASE_HOST);
db.createUser({
user: DATABASE_DBUSER,
pwd: DATABASE_DBPASS,
roles: [
{
role: 'readWrite',
db: DATABASE_DBNAME,
},
],
});
docker-compose.yml
version: "3.7"
# Lets define all our services (i.e. our containers to run)
services:
# create a mongodb database
travel-db:
image: mongo
container_name: "travel-db"
env_file:
- ./.env
volumes:
- ./src/helpers/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
- "mongodb:/data/db/"
# opening mongodb port so that it can be connected from host
ports:
- "27017:27017"
# create redis-server
travel-redis-server:
image: redis:latest
container_name: "travel-redis-server"
env_file:
- ./.env
volumes:
- redis:/data/
ports:
- "6379:6379"
# express app
travel-express-server:
image: "travel-express-server"
container_name: "travel-express-server"
env_file:
- ./.env
volumes:
- .:/usr/src/app
ports:
- "8000:8000"
volumes:
mongodb: {}
redis: {}
我收到以下错误
更新
我把 mongo-init.js 改成了
db.createUser({
user: 'traveluser',
pwd: 'travel123',
roles: [
{
role: 'readWrite',
db: 'travel_db',
},
],
});
然后它会说以下内容
Successfully added user: {
travel-db | "user" : "traveluser",
travel-db | "roles" : [
travel-db | {
travel-db | "role" : "readWrite",
travel-db | "db" : "travel_db"
travel-db | }
travel-db | ]
travel-db | }
但身份验证仍然出错
SASL SCRAM-SHA-1 authentication failed for traveluser on travel_db from client 172.20.0.4:36562 ; UserNotFound: Could not find user "traveluser" for db "travel_db"
如果我使用
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=pass
然后评论以下 - ./src/helpers/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro 并使用管理员访问权限更改 env 变量然后它可以工作,但不是管理员。
【问题讨论】:
-
您没有指定在哪个数据库中创建用户,所以它可能是在 admin 数据库中创建的。尝试使用
admin作为身份验证数据库。 -
你的意思是说在创建用户时要包含
use admin? -
这是默认设置。我的意思是当您尝试连接时,将
authSource=admin添加到您的连接字符串,或使用--authenticationDatabase admin选项,或任何适合您正在使用的驱动程序的函数。 -
确认一下,你的意思是说这个让dbUrl =
mongodb://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_DBNAME}?authSource=${DATABASE_DBNAME}; ? -
它适用于管理员案例,但不适用于其他用户。