为不存在的数据库创建用户不起作用
Creating a user for a non existing database not working
我正在尝试在 docker 容器中部署 MongoDB 数据库。这个数据库然后被节点 js 服务器使用。
当我启动 mongo 容器时,它首先执行一个有效的 shell 脚本,因为我可以看到它记录了错误代码 1,这意味着请求成功。这是文件:
mongo -- "$MONGO_INITDB_DATABASE" <<EOF
var rootUser = '$MONGO_INITDB_ROOT_USERNAME';
var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD';
var user = '$MONGO_INITDB_USERNAME';
var passwd = '$MONGO_INITDB_USERNAME';
var admin = db.getSiblingDB('admin');
admin.auth(rootUser, rootPassword);
db.createUser({user: user, pwd: passwd, roles: [{role:"readWrite",db:"$MONGO_INITDB_DATABASE"]});
EOF
但是在完成此操作后,我尝试使用 nodejs 服务器连接到数据库,它输出应该创建的用户登录失败。
为了进一步研究,我随后进入 MongoDB 容器来执行相同的脚本。我是这样做的:
use admin #To log in as admin
db.auth({user: root, PWD: rootPwd})
use mydatabase
db.createUser({user: user, PWD: passwd, roles:[{role:"readWrite",db:"myDatabase"]});
然后我看到我的nodejs访问数据库没有问题。
我不知道我做错了什么,因为一切似乎都正常。
我实际上已经意识到我收到了这条错误消息:
Error saving history file: FileOpenFailed: Unable to open() file /home/mongodb/.dbshell: Unknown error
但我在创建 root 用户时也得到了它,因为我的 root 用户正在工作,我认为这不是问题所在。
编辑
这是 Dockerfile:
FROM node: latest
WORKDIR /opt/app
COPY app .
COPY .env ./
RUN npm i
EXPOSE 3000
CMD npm run start:prod
这是 docker-compose 文件:
version: '3.7'
services:
mongo:
container_name: mongo
image: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
MONGO_INITDB_DATABASE: ${MONGO_INITDB_DATABASE}
MONGO_INITDB_USERNAME: ${MONGO_INITDB_USERNAME}
MONGO_INITDB_PASSWORD: ${MONGO_INITDB_PASSWORD}
volumes:
- /data:/data/db
- ./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh
api:
container_name: api
build:
context: .
dockerfile: Dockerfile.production
image: api
depends_on:
- mongo
restart: always
ports:
- 3000:3000
var passwd = '$MONGO_INITDB_USERNAME';
您在这里设置的密码是否正确? (它使用的是 $USERNAME 变量而不是密码变量)
我正在尝试在 docker 容器中部署 MongoDB 数据库。这个数据库然后被节点 js 服务器使用。
当我启动 mongo 容器时,它首先执行一个有效的 shell 脚本,因为我可以看到它记录了错误代码 1,这意味着请求成功。这是文件:
mongo -- "$MONGO_INITDB_DATABASE" <<EOF
var rootUser = '$MONGO_INITDB_ROOT_USERNAME';
var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD';
var user = '$MONGO_INITDB_USERNAME';
var passwd = '$MONGO_INITDB_USERNAME';
var admin = db.getSiblingDB('admin');
admin.auth(rootUser, rootPassword);
db.createUser({user: user, pwd: passwd, roles: [{role:"readWrite",db:"$MONGO_INITDB_DATABASE"]});
EOF
但是在完成此操作后,我尝试使用 nodejs 服务器连接到数据库,它输出应该创建的用户登录失败。
为了进一步研究,我随后进入 MongoDB 容器来执行相同的脚本。我是这样做的:
use admin #To log in as admin
db.auth({user: root, PWD: rootPwd})
use mydatabase
db.createUser({user: user, PWD: passwd, roles:[{role:"readWrite",db:"myDatabase"]});
然后我看到我的nodejs访问数据库没有问题。
我不知道我做错了什么,因为一切似乎都正常。
我实际上已经意识到我收到了这条错误消息:
Error saving history file: FileOpenFailed: Unable to open() file /home/mongodb/.dbshell: Unknown error
但我在创建 root 用户时也得到了它,因为我的 root 用户正在工作,我认为这不是问题所在。
编辑
这是 Dockerfile:
FROM node: latest
WORKDIR /opt/app
COPY app .
COPY .env ./
RUN npm i
EXPOSE 3000
CMD npm run start:prod
这是 docker-compose 文件:
version: '3.7'
services:
mongo:
container_name: mongo
image: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
MONGO_INITDB_DATABASE: ${MONGO_INITDB_DATABASE}
MONGO_INITDB_USERNAME: ${MONGO_INITDB_USERNAME}
MONGO_INITDB_PASSWORD: ${MONGO_INITDB_PASSWORD}
volumes:
- /data:/data/db
- ./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh
api:
container_name: api
build:
context: .
dockerfile: Dockerfile.production
image: api
depends_on:
- mongo
restart: always
ports:
- 3000:3000
var passwd = '$MONGO_INITDB_USERNAME';
您在这里设置的密码是否正确? (它使用的是 $USERNAME 变量而不是密码变量)