MongoDB和Docker通过docker-compose auth错误而不是初始化数据库

时间:2019-03-03 09:19:44

标签: mongodb docker docker-compose

我是Docker的新手,并且已经阅读了Mongo Docker Docs。 我需要一些帮助来建立一个简单的应用程序。

我想要一个转储/使用名为“ my_test_db”的数据库的本地mongodb 并写入<project-dir>/mongo/my_test_db

这是我的简单项目:

# project structure
<project-dir>/
-- .env
-- docker-compose.yml
-- mongo/
-- + -- my_test_db/

.env文件:

# <project>/.env
MONGO_INITDB_ROOT_USERNAME=test_user
MONGO_INITDB_ROOT_PASSWORD=test_pwrd
MONGO_INITDB_DATABASE=my_test_db
MONGO_DATA_DIR=/mongo/my_test_db
MONGO_LOG_FILE=/mongo/mongodb.log

我尝试docker compose

#docker-compose.yml

version: '3'
services:
  mongodb:
    image: mongo:4.0

    # load env variables
    env_file:
      - .env 

    # map data_dir to host <project>/<data_dir>
    volumes:
      - ".${MONGO_DATA_DIR}:${MONGO_DATA_DIR}"

    expose:
      - 27017

    # set env vars with loaded vars (appears to be necessary for the user to be created, despite loading them with env_file)
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_DATABASE}
      MONGO_INITDB_DATABASE: ${MONGO_INITDB_DATABASE}

    # map ports
    ports:
        - 27017:27017
    command: "mongod --smallfiles"
    container_name: mongodb-test
# --logpath=.${MONGO_LOG_FILE} # when added to command fails

然后在我拥有的两个弹壳中

#shell-1
<project-dir>$ docker-compose up

# I see my user created
# I see "MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=e19ea190b601" so my custom db isnt made on init...
#shell-2
# <project-dir>$ mongo 27017 --usernamne test_user --password test_pwrd # does fails to connect
<project-dir>$ mongo 27017 # connects



> db.getName()
# 27017 # so naming it didnt work

> show users
# Error: command usersInfo requires authentication

> use my_test_db
> db.myColl.insert({'name': 'test'})
# WriteCommandError({..., "codeName": "Unauthorized"})


我目前正在macOS上进行测试(文档表明这可能是相关的)

我在做什么错?我了解docker的概念,但个人不使用docker的概念,因为这也让我很难使用...但是我正在尝试学习。

1 个答案:

答案 0 :(得分:1)

  • 对于身份验证部分:您是否尝试添加--authenticationDatabase admin以便能够登录?
  • 关于MONGO_INITDB_DATABASE,除非您在/docker-entrypoint-initdb.d/下有一个脚本(如mongodb图像中使用的docker-entrypoiny.sh所示),否则它不会生效,因此您可以拥有bash脚本在docker-entrypoint-initdb.d/中这样说。

  • 使用root用户作为应用程序数据库的所有者不是安全的方法,因为它可以控制mongodb实例中的所有内容。

    恕我直言,更好的方法是添加如下所示的额外变量:

    • MONGO_APPLICATION_DATABASE
    • MONGO_APPLICATION_USERNAME
    • MONGO_APPLICATION_PASSWORD

    然后添加一个bash脚本,该脚本将创建用户并将其通过使用环境变量分配给数据库(您需要将其挂载到docker-entrypoint-initdb.d):

      

    您可能需要根据需要更改用户角色。

    # initmongo/setup.sh
    mongo admin -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD --eval "db.getSiblingDB('$MONGO_APPLICATION_DATABASE').createUser({user: '$MONGO_APPLICATION_USERNAME', pwd: '$MONGO_APPLICATION_PASSWORD', roles: [{role: 'readWrite', db: '$MONGO_APPLICATION_DATABASE'}]});"
    

    在docker-compose.yml中,将一个卷添加到当前的卷列表中

    #docker-compose.yml
    volumes:
      - ".${MONGO_DATA_DIR}:${MONGO_DATA_DIR}"
      - "./initmongo/:/docker-entrypoint-initdb.d/"
    

    最后删除此变量MONGO_INITDB_DATABASE,因为不需要它

    要登录,请使用以下命令:

      

    用实际值替换变量

    docker exec -it container_name mongo -u "$MONGO_APPLICATION_USERNAME" -p "$MONGO_APPLICATION_PASSWORD" --authenticationDatabase "$MONGO_APPLICATION_DATABASE" "$MONGO_APPLICATION_DATABASE"
    
  • 对于.env文件,我不确定是什么原因导致此问题。使用时是否有任何警告?还可以考虑检查this commentthis