因此,目前我有一个docker-compose.yml
文件,该文件具有以下内容:
version: "2"
services:
pastime:
build:
context: ./pastime
dockerfile: ./Dockerfile
volumes:
- ./pastime:/usr/src/app
- /usr/src/app/node_modules
ports:
- "3000:3000"
depends_on:
- mongo
environment:
- PORT=3000
- DATABASE_USER=pastime
- DATABASE_URL=mongo:27017
- DATABASE_PASS=pastime123
- DATABASE_NAME=pastime
command: npm run start:dev
mongo:
image: mongo:latest
restart: always
ports:
- "27017:27017"
environment:
- MONGO_INITDB_DATABASE=pastime
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=root_password
volumes:
- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
我的init-mongo.js
文件还具有:
db.createUser({
user: 'pastime',
pwd: 'pastime123',
roles: [
{
role: 'readWrite',
db: 'pastime'
}
]
})
我不确定为什么,但是每次执行docker-compose logs -f mongo
时我得到的输出都是:
SASL SCRAM-SHA-1 authentication failed for pastime on admin from client 172.19.0.3:55568 ; UserNotFound: Could not find user "pastime"...
我怀疑初始化脚本没有运行,因为在mongo容器中看不到有关它的各种日志。
遵循了一些示例,主要是通过以下示例: How to create a DB for MongoDB container on start up?
答案 0 :(得分:1)
您上面发布的配置应该可以使用。我怀疑您可能是在由于错误而将<form method="post" action="/youraction">
//....content of form
<button onClick="submitForm()">Submit</button>
</form>
<script>
submitForm(){
//perform AJAX request here and check the response.if status is Ok close your modal else show the error message.
}
</script>
安装在init-mongo.js
下的/docker-entrypoint-initdb.d/init-mongo.js
之前启动了容器。
由于您没有为mongodb装入数据卷,因此您可以使用以下命令简单地销毁并重新启动容器:
docker-compose down
docker-compose up -d
docker-compose logs -f
我真的很好奇,所以复制了您的配置并成功对其进行了测试。请参见docker-compose logs -f
中的代码段:
mongo_1 | 2019-09-06T15:43:19.982+0000 I NETWORK [conn3] received client metadata from 127.0.0.1:46874 conn3: { application: { name: "MongoDB Shell" }, driver: { name: "MongoDB Internal Client", version: "4.2.0" }, os: { type: "Linux", name: "Ubuntu", architecture: "x86_64", version: "18.04" } }
mongo_1 | Successfully added user: {
mongo_1 | "user" : "pastime",
mongo_1 | "roles" : [
mongo_1 | {
mongo_1 | "role" : "readWrite",
mongo_1 | "db" : "pastime"
mongo_1 | }
mongo_1 | ]
mongo_1 | }
我能够执行该容器并与该用户连接到数据库:
$ docker-compose exec mongo bash
root@62ec89743bc0:/# mongo --username pastime --password pastime123 --authenticationDatabase pastime
MongoDB shell version v4.2.0
connecting to: mongodb://127.0.0.1:27017/?authSource=pastime&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("313dd5a9-c417-42c2-b35e-27b301e82def") }
MongoDB server version: 4.2.0
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
> use pastime
switched to db pastime
>
$ cat docker-compose.yml
version: "2"
services:
mongo:
image: mongo:latest
restart: always
ports:
- "27017:27017"
environment:
- MONGO_INITDB_DATABASE=pastime
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=root_password
volumes:
- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
$ cat init-mongo.js
db.createUser({
user: 'pastime',
pwd: 'pastime123',
roles: [
{
role: 'readWrite',
db: 'pastime'
}
]
})
答案 1 :(得分:-1)
有一些与 Stack Overflow 上的一些帖子的对应关系 - 我认为这个帖子很有趣,并以非常全面的方式添加了一些见解:https://stackoverflow.com/a/53522699/13232069
重点是在创建新用户之前需要登录管理员。除了 docker-compose.yml
文件外,它看起来像(使用 shell 脚本 - 所有功劳归于 x-yuri):
init-mongo.sh:
mongo -- "$MONGO_INITDB_DATABASE" <<EOF
var rootUser = '$MONGO_INITDB_ROOT_USERNAME';
var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD';
var admin = db.getSiblingDB('admin');
admin.auth(rootUser, rootPassword);
var user = '$MONGO_INITDB_USERNAME';
var passwd = '$(cat "$MONGO_INITDB_PASSWORD_FILE")';
db.createUser({user: user, pwd: passwd, roles: ["readWrite"]});
EOF
或使用 mongo-init.js 文件:
db = db.getSiblingDB('admin');
// move to the admin db - always created in Mongo
db.auth("rootUser", "rootPassword");
// log as root admin if you decided to authenticate in your docker-compose file...
db = db.getSiblingDB('DB_test');
// create and move to your new database
db.createUser({
'user': "dbUser",
'pwd': "dbPwd",
'roles': [{
'role': 'dbOwner',
'db': 'DB_test'}]});
// user created
db.createCollection('collection_test');
// add new collection
这种洞察力绝对让我大开眼界!