MongoDB和Docker通过docker-compose auth错误而不是初始化数据库 [英] MongoDB and Docker via docker-compose auth error and not initalizing db
问题描述
我是Docker的新手,并且已阅读 Mongo Docker Docs 。
我需要一些帮助来设置一个简单的应用程序。
I am new to Docker and I have read the Mongo Docker Docs. I need some help setting up a simple application.
我想要一个本地mongodb来转储/使用名为 my_test_db的数据库
并进行写操作到< project-dir> / mongo / my_test_db
I want a local mongodb that dumps / uses a database named "my_test_db"
and writes to <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上进行测试(文档表明这可能是相关的)
I am currently testing on macOS (as docs state that this might be relevant)
我在做什么错?我了解docker的概念,但个人不使用docker的概念,因为这也使我很难使用...但是我正在尝试学习。
What am I doing wrong? I understand the concept of docker but personally don't use it as it is a pain to get used too... but I'm trying to learn.
推荐答案
- 对于身份验证部分:您是否尝试添加
-authenticationDatabase admin
以便能够登录? -
关于
MONGO_INITDB_DATABASE
除非您在/ docker-entrypoint-下有一个脚本,否则它不会生效initdb.d /
如 docker-entrypoiny.sh ,因此您可以在docker-entrypoint-initdb.d / $ c $中使用bash脚本
- For the authentication part: have you tried to add
--authenticationDatabase admin
in order to be able to login ? Regarding
MONGO_INITDB_DATABASE
it wont be effective unless you have a script under/docker-entrypoint-initdb.d/
as shown in the docker-entrypoiny.sh that is used in the mongodb image so you can have a bash script indocker-entrypoint-initdb.d/
with that said.使用root用户作为应用程序数据库的所有者不是安全的方法,因为它将能够控制其中的所有内容。 mongodb实例。
Using the root user as an owner for your application db is not a security wise as it will have the ability to control everything in the mongodb instance.
恕我直言,更好的方法是添加额外的变量,例如以下内容:
IMHO a better approach would be adding extra variables like the following:
-
MONGO_APPLICATION_DATABASE
-
MONGO_APPLICATION_USERNAME
-
MONGO_APPLICATION_PASSWORD
MONGO_APPLICATION_DATABASE
MONGO_APPLICATION_USERNAME
MONGO_APPLICATION_PASSWORD
然后添加一个bash脚本,该脚本将创建用户并使用环境变量将其分配给数据库(您需要将其挂载到docker-entrypoint-initdb.d):
Then add a bash script that will create the user and assign it to the database by using environment variables ( you need to mount it to docker-entrypoint-initdb.d):
您可能需要根据需要更改用户角色。
You might need to change the user role as you see fit.
# 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中将卷添加到当前卷列表中
In the docker-compose.yml add a volume to your current list of volumes
#docker-compose.yml volumes: - ".${MONGO_DATA_DIR}:${MONGO_DATA_DIR}" - "./initmongo/:/docker-entrypoint-initdb.d/"
最后删除此变量
MONGO_INITDB_DATABASE
,因为不需要它And finally remove this variable
MONGO_INITDB_DATABASE
as there is no need for it要登录,请使用以下命令:
In order to login use the following command:
将变量替换为您的实际值
replace the variables with your actual values
docker exec -it container_name mongo -u "$MONGO_APPLICATION_USERNAME" -p "$MONGO_APPLICATION_PASSWORD" --authenticationDatabase "$MONGO_APPLICATION_DATABASE" "$MONGO_APPLICATION_DATABASE"
-
For the
.env
file i am not sure what could cause this issue. do you have any warnings while using it ? Also Consider checking this comment or this这篇关于MongoDB和Docker通过docker-compose auth错误而不是初始化数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
- For the authentication part: have you tried to add