docker compose无法为mongodb创建用户和密码
我正在跟随这个mongo的官方docker来配置mongodb,以启用授权并创建用户、密码和数据库。然而,当我启动docker compose我的nodejs组件时,它无法连接到mongodb,因为mongodb端没有创建用户 docker compose.ymldocker compose无法为mongodb创建用户和密码,mongodb,docker,docker-compose,Mongodb,Docker,Docker Compose,我正在跟随这个mongo的官方docker来配置mongodb,以启用授权并创建用户、密码和数据库。然而,当我启动docker compose我的nodejs组件时,它无法连接到mongodb,因为mongodb端没有创建用户 docker compose.yml version: "3" services: nodejs: container_name: nodejs # How the container will appear when listing containers f
version: "3"
services:
nodejs:
container_name: nodejs # How the container will appear when listing containers from the CLI
build:
context: .
dockerfile: Dockerfile-nodejs
user: node # The user to run as in the container
working_dir: "/app" # Where to container will assume it should run commands and where you will start out if you go inside the container
networks:
- app # Networking can get complex, but for all intents and purposes just know that containers on the same network can speak to each other
ports:
- "3000:3000" # <host-port>:<container-port> to listen to, so anything running on port 3000 of the container will map to port 3000 on our localhost
volumes:
- ./:/app # <host-directory>:<container-directory> this says map the current directory from your system to the /app directory in the docker container
command: # The command docker will execute when starting the container, this command is not allowed to exit, if it does your container will stop
- ./wait-for.sh
- mongodb:27017
- --
- /bin/sh
- -c
- npm install && npm start
env_file: .env
environment:
- MONGO_USERNAME=$MONGO_USERNAME
- MONGO_PASSWORD=$MONGO_PASSWORD
- MONGO_HOSTNAME=mongodb
- MONGO_PORT=$MONGO_PORT
- MONGO_DB=$MONGO_DB
depends_on:
- mongodb
mongodb:
image: mongo:4.1.8-xenial
container_name: mongodb
restart: always
env_file: .env
environment:
- MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME
- MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD
- MONGO_INITDB_DATABASE=$MONGO_DB
networks:
- app
networks:
app:
driver: bridge
.env
MONGO_USERNAME=simpleUser
MONGO_PASSWORD=123456
MONGO_PORT=27017
MONGO_DB=simpleDb
app.js
FROM node:10
RUN apt update && apt install -y netcat
const express = require('express');
var server = express();
var bodyParser = require('body-parser');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
// getting-started.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://simpleUser:123456@mongodb:27017/simpleDb', {useNewUrlParser: true});
server.use(passport.initialize());
server.use(bodyParser.urlencoded({ extended: true }));
passport.serializeUser(function (user, done) {
done(null, user);
});
passport.deserializeUser(function (id, done) {
done(null, id);
});
passport.use(new LocalStrategy(
function (username, password, done) {
var user = { username: username };
return done(null, user);
}
));
server.get('/', function(req, res) {
res.send('Hello World');
});
server.post('/login', passport.authenticate('local', { failureRedirect: 'failure' }), function (req, res) {
res.send('access granted');
});
server.listen(3000, function() {
console.log('Example app listening on port 3000');
});
>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aad21da1ed48 biblio_nodejs "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 0.0.0.0:3000->3000/tcp nodejs
24c200f341ac mongo:4.1.8-xenial "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 27017/tcp mongodb
>docker撰写日志-f mongodb
2019-06-13T13:37:11.104+0000 I NETWORK [listener] connection accepted from 192.168.0.3:53942 #2 (1 connection now open)
2019-06-13T13:37:11.110+0000 I NETWORK [conn2] received client metadata from 192.168.0.3:53942 conn2: { driver: { name: "nodejs", version: "3.2.7" }, os: { type: "Linux", name: "linux", architecture: "x64", version: "4.14.116-boot2docker" }, platform: "Node.js v10.16.0, LE, mongodb-core: 3.2.7" }
2019-06-13T13:37:11.111+0000 I SHARDING [conn2] Marking collection admin.system.users as collection version: <unsharded>
2019-06-13T13:37:11.112+0000 I ACCESS [conn2] Supported SASL mechanisms requested for unknown user 'simpleUser@simpleDb'
2019-06-13T13:37:11.127+0000 I ACCESS [conn2] SASL SCRAM-SHA-1 authentication failed for simpleUser on simpleDb from client 192.168.0.3:53942 ; UserNotFound: Could not find user "simpleUser" for db "simpleDb"
2019-06-13T13:37:11.133+0000 I NETWORK [conn2] end connection 192.168.0.3:53942 (0 connections now open)
2019-06-13T13:37:11.104+0000 I网络[侦听器]连接已从192.168.0.3:53942#2接受(1个连接现已打开)
2019-06-13T13:37:11.110+0000 I网络[conn2]从192.168.0.3:53942接收到客户端元数据conn2:{驱动程序:{名称:“nodejs”,版本:“3.2.7”},操作系统:{类型:“Linux”,名称:“Linux”,体系结构:“x64”,版本:“4.14.116-boot2docker”},平台:“Node.js v10.16.0,LE,mongodb核心:3.2.7”}
2019-06-13T13:37:11.111+0000 I分片[conn2]将collection admin.system.users标记为集合版本:
2019-06-13T13:37:11.112+0000 I访问[conn2]为未知用户请求支持的SASL机制simpleUser@simpleDb'
2019-06-13T13:37:11.127+0000 I访问[conn2]客户端192.168.0.3:53942对simpleDb上的simpleUser进行SASL SCRAM-SHA-1身份验证失败;UserNotFound:找不到数据库“simpleDb”的用户“simpleUser”
2019-06-13T13:37:11.133+0000 I网络[conn2]端连接192.168.0.3:53942(0个连接现在打开)
我想我找到了问题所在node
应用程序无法访问mongo
,因为我需要添加authSource=admin
参数,该参数指向数据库保存用户凭据的位置。它还解释了
因此,最终的url将是
mongodb://simpleUser:123456@mongodb:27017/simpleDb?authSource=admin
我想我找到了问题所在node
应用程序无法访问mongo
,因为我需要添加authSource=admin
参数,该参数指向数据库保存用户凭据的位置。它还解释了
因此,最终的url将是
mongodb://simpleUser:123456@mongodb:27017/simpleDb?authSource=admin
这些环境变量(例如$MONGO\u USERNAME
)应该来自文件.env
。你能展示一下那个文件吗?此外,理想情况下,您应该从app.js
中的环境中读取这些凭证,而不是硬编码该URL。也许.env
不匹配?@ford true你是对的,我应该在app.js中阅读它们,但我认为现在这并不重要。顺便说一下,我还添加了.env
文件,很抱歉忘记了这些环境变量(例如$MONGO_USERNAME
)应该来自文件.env
。你能展示一下那个文件吗?此外,理想情况下,您应该从app.js
中的环境中读取这些凭证,而不是硬编码该URL。也许.env
不匹配?@ford true你是对的,我应该在app.js中阅读它们,但我认为现在这并不重要。顺便说一下,我还添加了.env
文件,很抱歉忘记了,在调试了11个小时后,你帮了我的忙,谢谢!这是我第一次看到它在我所涉猎过的所有例子中被引用。说到这里,我注意到我可以使用Compass连接,他们在生成的url中有这个参数。可能一开始就应该用这个。你活着,你学习。无论如何,再次感谢!经过11个小时的调试,你帮了我的忙,谢谢!这是我第一次看到它在我所涉猎过的所有例子中被引用。说到这里,我注意到我可以使用Compass连接,他们在生成的url中有这个参数。可能一开始就应该用这个。你活着,你学习。无论如何,再次感谢!