我想在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
配置(如发布在官方文档中)不起作用。我在做什么错了?
谢谢。
答案 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
,因为基本图像已经在使用它。