MongoDb身份验证在使用Docker时无法访问数据库?

时间:2020-06-16 17:54:37

标签: mongodb docker docker-compose

我一直在尝试设置mongodb的密码

我的docker-compose文件是

version: "3"
services:
    mongo:
        image: mongo
        ports:
            - "27016:27017"
        volumes:
            - ./data:/data/db
        environment:
            - MONGO_INITDB_ROOT_USERNAME=root
            - MONGO_INITDB_ROOT_PASSWORD=password
            - MONG_INITDB_DATABASE=example

现在运行docker容器后,当我尝试 进入容器后

mongo mongodb://root:password@localhost:27017

连接成功,

MongoDB Shell版本v4.2.7 连接到:mongodb:// localhost:27017 /?compressors = disabled&gssapiServiceName = mongodb 隐式会话:会话{“ id”:UUID(“ 71ec853d-3a05-4367-aa9f-d0a69217fb7d”)} MongoDB服务器版本:4.2.7 服务器有启动警告: 2020-06-16T17:43:51.837 + 0000我存储了[initandlisten] 2020-06-16T17:43:51.837 + 0000 I STORAGE [initandlisten] **警告:强烈建议WiredTiger存储引擎使用XFS文件系统 2020-06-16T17:43:51.837 + 0000 I存储[initandlisten] **请参见

但是当我尝试

mongo mongodb://root:password@localhost:27017/example

身份验证失败。 MongoDB Shell版本v4.2.7 连接到:mongodb:// localhost:27017 / example?compressors = disabled&gssapiServiceName = mongodb 2020-06-16T17:51:08.226 + 0000 E查询[js]错误:验证失败。 : connect@src/mongo/shell/mongo.js:341:17

当我尝试使用节点应用程序从外部访问时也是如此。 (也可以使用docker-compose运行节点应用)

mongo mongodb:// root:password @ mongo:27017 / example

3 个答案:

答案 0 :(得分:3)

不知道为什么在任何博客或教程中都没有提到它,但是根据官方文档, https://docs.mongodb.com/manual/reference/connection-string/#components

/defaultauthdb  
Optional. The authentication database to use if the connection string includes username:password@ authentication credentials but the authSource option is unspecified.

If both authSource and defaultauthdb are unspecified, the client will attempt to authenticate the specified user to the admin database.

所以最终可行的方法是添加authSource,而没有authSource的mongod尝试在添加authSource之后在/ example db中找到证书,从而给出错误消息

mongodb://root:password@localhost:27016/example?authSource=admin

这可以成功地将数据添加到示例数据库

答案 1 :(得分:1)

在将Docker容器的27017端口映射到主机的27016端口时,应尝试从容器外部连接到updateCache()

答案 2 :(得分:0)

注意两点:

  1. “ MONG_INITDB_DATABASE”将不会创建数据库,除非它存在于您的数据卷绑定中,即“ ./data:/data/db”。如果存在,那么您需要使用在“数据”下创建的特定角色
  2. 如果不是#1,则需要提供一个文件,该文件将在/docker-entrypoint-initdb.d/*.js下创建数据库。下面是一个模板:

    db.createUser(
        {
            user: "<user for database which shall be created>",
            pwd: "<password of user>",
            roles: [
                {
                    role: "readWrite",
                    db: "<database to create>"
                }
            ]
        }
    

    );

您可以在他们的官方docker hub image处获得更多推荐。部分: MONGO_INITDB_DATABASE 初始化新实例