在mongoDB官方docker映像中创建数据库和用户

时间:2018-09-16 09:38:17

标签: mongodb docker docker-compose

我想在Docker中运行MongoDB服务,以便提供Flask应用程序。我试过的是使用docker-compose.yml创建一个容器:

my_mongo_service:
  image: mongo
  environment:
      - MONGO_INITDB_ROOT_USERNAME=${MONGO_ROOT_USER}
      - MONGO_INITDB_ROOT_PASSWORD=${MONGO_ROOT_PASSWORD}
      - MONGO_INITDB_DATABASE=${MY_DATABASE_NAME}
  ports:
    - "27017:27017"
  volumes:
    - "/data/db:/data/db"
  command: mongod

假设我们有一个.env文件,如下所示:

MONGO_ROOT_USER=my_fancy_username
MONGO_ROOT_PASSWORD=my_fancy_password
MY_DATABASE_NAME=my_fancy_database

我期望(读the doc)是创建了一个与MY_DATABASE_NAME值匹配的数据库,并且也创建了一个与MONGO_ROOT_USER匹配的用户,我可以使用该对进行验证({{ 1}},MONGO_ROOT_USER)。

好的,我用MONGO_ROOT_PASSWORD启动容器,然后用docker-compose up输入。我将docker exec -it <container-id> bash放在控制台上,当我尝试对其进行身份验证时会崩溃:

mongo

在日志上,我发现以下错误

> use my_fancy_database
switched to db my_fancy_database
> db.auth('my_fancy_username','my_fancy_password')
Error: Authentication failed.
0 

[...] authentication failed for my_fancy_username on my_fancy_database from client [...] ; UserNotFound: Could not find user my_fancy_username@my_fancy_database 配置(如发布在官方文档中)不起作用。我在做什么错了?

谢谢。

1 个答案:

答案 0 :(得分:0)

我不明白。您是否正在使用环境中没有的环境变量?看起来确实如此。

如果您在终端机上进行echo $MY_DATABASE_NAME并看到空的输出,那么这里就是您问题的答案。您要么首先必须使用export定义变量(或为文件使用source),要么重新定义docker-compose.yml

为此,最好使用env_file指令:

my_mongo_service:
  image: mongo
  env_file:
      - .env
  ports:
    - "27017:27017"
  volumes:
    - "/data/db:/data/db"

然后将您的.env设置为:

MONGO_INITDB_ROOT_USERNAME=my_fancy_username
MONGO_INITDB_ROOT_PASSWORD=my_fancy_password
MONGO_INITDB_DATABASE=my_fancy_database

旁注:不需要使用command: mongod,因为基本图像已经在使用它。