无法针对 mongo docker 容器进行身份验证

Unable to auth against mongo docker container

我已经使用官方 docker 容器创建了一个 mongo 服务器。

如果我检查容器,我会发现以下预期环境:

 "StdinOnce": false,
            "Env": [
                "MONGO_INITDB_ROOT_USERNAME=root",
                "MONGO_INITDB_ROOT_PASSWORD=xxxxx",
                "MONGO_INITDB_DATABASE=unpubd",
                "affinity:container==5b49b08d73960bfefe10eae7df25328f2296d9eb2c648af330e3ef75f928a289",
                ,
                "GOSU_VERSION=1.12",
                "JSYAML_VERSION=3.13.1",
                "MONGO_PACKAGE=mongodb-org",
                "MONGO_REPO=repo.mongodb.org",
                "MONGO_MAJOR=5.0",
                "MONGO_VERSION=5.0.4"
            ],

我的理解是,这应该创建一个名为 unpubd 的数据库,并且 具有指定密码的 root 用户。

问题是我无法对容器进行授权。 我已经尝试了三个不同的 url 都得到了相同的结果。:

mongodb://root:XXXX@localhost:27017/
mongodb://root:XXXX@localhost:27017/unpub
mongodb://root:XXXX@localhost:27017/admin
mongodb://root:XXXX@localhost:27017/unpubd?authSource=admin

MongoDart Error: Authentication failed.

我也试过 mongo 命令 shell:

use admin
var x = new Mongo('localhost');
var mydb = x.getDB('unpubd');
mydb.auth('root', 'XXXX')
Error: Authentication failed.

我不清楚 auth 数据库与我的 unpubd 数据库。 我是否使用 admin db 进行身份验证? 我假设 root 用户将能够读取 unpub 数据库?

这是我的 docker-compose 文件

version: '3.1'

networks:
  unpubd:
    driver: bridge

volumes:
  mongodata: null

services:
  mongodb:
    container_name: mongo
    image: mongo:latest
    restart: on-failure
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
      MONGO_INITDB_DATABASE: ${MONGO_INITDB_DATABASE}
    volumes:
      - mongodata:/data/db 
    networks:
      - unpubd
    ports:
      - 27017:27017      

    logging:
      driver: "local"

  unpubd:
    container_name: unpubd
    image: noojee/unpubd:latest
    restart: on-failure
    depends_on:
      - mongodb
    environment:
      MONGO_ROOT_USERNAME: ${MONGO_ROOT_USERNAME}
      MONGO_ROOT_PASSWORD: ${MONGO_ROOT_PASSWORD}
      MONGO_DATABASE: ${MONGO_DATABASE}
      MONGO_HOST: ${MONGO_HOST}
      MONGO_PORT: ${MONGO_PORT}
      UNPUBD_PORT: ${UNPUBD_PORT}
      TZ: ${TZ}
    links:
      - mongodb
    networks:
      - unpubd
    ports:
      - ${UNPUBD_PORT}:${UNPUBD_PORT}
    logging:
      driver: "local"      

      

示例 .env 文件

MONGO_INITDB_ROOT_USERNAME=root
MONGO_INITDB_ROOT_PASSWORD=abc1234
MONGO_INITDB_DATABASE=unpubd
MONGO_DATABASE=unpubd
MONGO_ROOT_USERNAME=root
MONGO_ROOT_PASSWORD=abc1234
MONGO_DATABASE=unpubd
MONGO_HOST=mongodb
MONGO_PORT=27017
TZ=AUS Eastern Daylight Time
UNPUBD_HOST=0.0.0.0
UNPUBD_PORT=4000

我花了一秒钟才弄明白。

从日志中我可以看到,当 mongodb 启动时,它会执行以下操作:

mongo   | Successfully added user: {
mongo   |   "user" : "root",
mongo   |   "roles" : [
mongo   |       {
mongo   |           "role" : "root",
mongo   |           "db" : "admin"
mongo   |       }
mongo   |   ]
mongo   | }

如您所见,它在管理数据库中创建用户,而不是您在 MONGO_INITDB_DATABASE 中指定的用户。

查看 mongo 图像在 docker 中心的文档:

MONGO_INITDB_ROOT_USERNAME, MONGO_INITDB_ROOT_PASSWORD:

These variables, used in conjunction, create a new user and set that user's password. This user is created in the admin authentication database and given the role of root, which is a "superuser" role.

MONGO_INITDB_DATABASE:

This variable allows you to specify the name of a database to be used for creation scripts in /docker-entrypoint-initdb.d/*.js

您需要做的是创建一个脚本,将您的用户添加到您在 init 环境变量中使用的数据库中,例如:

db.createUser(
   {
     user: "root",
     pwd: "abc1234",
     roles: [ "readWrite", "dbAdmin" ]
   }
)

并将其绑定到 /docker-entrypoint-initdb.d/