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

问题描述 投票:2回答:1

我希望在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的用户,我可以使用该对进行身份验证(MONGO_ROOT_USERMONGO_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

docker-compose.yml配置(因为它发布在官方文档中)不起作用。我做错了什么?

提前致谢。

mongodb docker docker-compose
1个回答
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不是必需的,基本图像已经在使用它。

© www.soinside.com 2019 - 2024. All rights reserved.