为不存在的数据库创建用户无法正常工作

时间:2019-07-17 16:50:13

标签: mongodb docker docker-compose dockerfile mongo-shell

我正在尝试在docker容器中部署mongodb数据库。然后,此数据库由nodejs服务器使用。

当我启动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 login 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

1 个答案:

答案 0 :(得分:0)

  

var passwd ='$ MONGO_INITDB_USERNAME';

您在此处设置正确的密码吗? (它使用的是$ USERNAME变量,而不是密码1)