简体   繁体   English

使用 docker-entrypoint-initdb.d 创建的 Mongodb 用户不会保留在数据库中

[英]Mongodb user created with docker-entrypoint-initdb.d doesn't persist in the database

I've been trying to create a user (who is not the administrator) for my database but I can't get it to persist in the database.我一直在尝试为我的数据库创建一个用户(不是管理员),但我无法让它保留在数据库中。

I'm using a sh init script from the docker-entrypoint-initdb.d entry point.我正在使用来自docker-entrypoint-initdb.d入口点的sh初始化脚本。 When I run docker-compose up everything seems to be working.当我运行docker-compose up一切似乎都在工作。 But when I try to connect and search for the user it doesn't appear.但是当我尝试连接并搜索用户时,它不会出现。

The log shows:日志显示:

UserNotFound: Could not find user \"john\" for db \"datadb\"

The structure of my project is really simple:我的项目结构非常简单:

在此处输入图像描述

docker-compose.yml docker-compose.yml

version: '3.3'
services:
  mongodb:
    image: mongo:latest
    container_name: mongo_db
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: rootpass
      MONGO_INITDB_DATABASE: datadb
    volumes:
      - ./init.d/:/docker-entrypoint-initdb.d/
      - mongodbdata:/data/db
    restart: always
volumes:
  mongodbdata:
    driver: local

init-mongo.sh初始化mongo.sh

#!/bin/bash
set -eu
mongo -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD <<EOF
    db = db.getSiblingDB('$MONGO_INITDB_DATABASE');
    use '$MONGO_INITDB_DATABASE';
    db.createUser({
        user: 'john', 
        pwd: '12345', 
        roles: [{
            role: 'readWrite', 
            db: '$MONGO_INITDB_DATABASE'
        }]
    });
EOF

Is there anything I'm missing?有什么我想念的吗?

If add show users after createUser in init-mongo.sh , you will find next in docker-compose logs :如果在init-mongo.shcreateUser之后添加show users ,您将在docker-compose logs中找到下一个:

mongo_db   | {
mongo_db   |    "_id" : "'datadb'.john",
mongo_db   |    "userId" : UUID("92abb590-3d2a-44d1-bde4-58b3b3acd1d8"),
mongo_db   |    "user" : "john",
mongo_db   |    "db" : "'datadb'",
mongo_db   |    "roles" : [
mongo_db   |            {
mongo_db   |                    "role" : "readWrite",
mongo_db   |                    "db" : "datadb"
mongo_db   |            }
mongo_db   |    ],
mongo_db   |    "mechanisms" : [
mongo_db   |            "SCRAM-SHA-1",
mongo_db   |            "SCRAM-SHA-256"
mongo_db   |    ]
mongo_db   | }

You could see it becomes "'datadb'.john" , not "datadb.john" , that means the database name now is 'datadb' , not datadb .你可以看到它变成了"'datadb'.john" ,而不是"datadb.john" ,这意味着现在的数据库名称是'datadb' ,而不是datadb So should change next line in init-mongo.sh , not use '$MONGO_INITDB_DATABASE';所以应该改变init-mongo.sh的下一行,而不是use '$MONGO_INITDB_DATABASE'; , but next: ,但接下来:

use $MONGO_INITDB_DATABASE;

Then, docker-compose down -v (Add -v to remove the volume, so the database will init again when up, with which you could see the effect), and docker-compose up -d , finally check it:然后, docker-compose down -v (加上 -v 删除卷,所以数据库在 up 时会重新初始化,你可以看到效果), docker-compose up -d ,最后检查一下:

> use datadb;
switched to db datadb
> show users;
{
        "_id" : "datadb.john",
        "userId" : UUID("0e643984-48f9-4da4-a3ea-0e7159240724"),
        "user" : "john",
        "db" : "datadb",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "datadb"
                }
        ],
        "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
        ]
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Docker Compose MongoDB docker-entrypoint-initdb.d 不起作用 - Docker Compose MongoDB docker-entrypoint-initdb.d is not working Docker docker-entrypoint-initdb.d/ 带有 Mongodb 的脚本不起作用 - Docker docker-entrypoint-initdb.d/ scripts with Mongodb aren't working docker-compose mongodb访问/docker-entrypoint-initdb.d/脚本中的env变量 - docker-compose mongodb access env variables in /docker-entrypoint-initdb.d/ script 重新创建MongoDB容器不会在docker-entrypoint-initdb.d中重新运行config.js文件 - Recreation of MongoDB container doesnt re-run config.js file in docker-entrypoint-initdb.d 存储 [main] 在 File::open() 中,::open for '/docker-entrypoint-initdb.d/create_user.js' 失败,权限被拒绝 - STORAGE [main] In File::open(), ::open for '/docker-entrypoint-initdb.d/create_user.js' failed with Permission denied 如何将环境变量传递给 mongo docker-entrypoint-initdb.d? - How can I pass environment variables to mongo docker-entrypoint-initdb.d? 由 Docker-compose 创建的 mongodb,不创建初始数据库? - mongodb created by Docker-compose, doesn't create initial db? MongoDB docker-entrypoint问题 - MongoDB docker-entrypoint issue FosUserBundle不要在mongodb数据库中保留数据 - FosUserBundle don't persist data in mongodb database 不显示创建的mongodb - Doesn't show created mongodb
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM