【发布时间】:2020-09-16 12:30:30
【问题描述】:
我有一个简单的 docker-compose.yml,如下所示:
services:
mongodb-service:
image: mongo:latest
command: "mongod --bind_ip_all"
mongodb-seeder:
image: mongo:latest
depends_on:
- mongodb-service
command: "mongoimport --uri mongodb://mongodb-service:27017/auth --drop --file /tmp/users.json"
myapp:
image: myapp:latest
environment:
DATABASEURL: mongodb://mongodb-service:27017/auth
depends_on:
- mongodb-service
myapp 是一个 nodejs 应用程序,它使用 mongoose 连接到 mongodb 数据库,如下所示:
const databaseURL = process.env.DATABASEURL;
async function connectToMongo() {
try {
return await mongoose.connect(databaseURL, {
useUnifiedTopology: true,
useNewUrlParser: true,
useCreateIndex: true,
});
}
catch (error) {
logger.error('MongoDB connect failure.', error);
}
}
mongodb-seeder 工作得很好。我可以启动它,它连接到mongodb-service 并毫无问题地运行导入。然而,myapp 启动,尝试连接到mongodb-service 30 秒,然后死机:
ERROR 2020-09-16T12:13:21.427 [MAIN] MongoDB connection error! [Arguments] {
'0': MongooseError [MongooseTimeoutError]: Server selection timed out after 30000 ms
...stacktrace snipped...
at Function.Module._load (internal/modules/cjs/loader.js:724:14) {
message: 'Server selection timed out after 30000 ms',
name: 'MongooseTimeoutError',
reason: Error: connect ECONNREFUSED 127.0.0.1:27017
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1128:14) {
name: 'MongoNetworkError',
[Symbol(mongoErrorContextSymbol)]: {}
},
[Symbol(mongoErrorContextSymbol)]: {}
}
}
注意:此日志中的 IP 地址表示它尝试连接到 127.0.0.1,不是 mongodb://mongodb-service:27017/auth。无论我为DATABASEURL 输入什么值,它都会继续打印127.0.0.1。任何想法为什么我不能让猫鼬识别我给它的主机名?为什么 mongoose 无法连接到网络明显可见的服务,因为另一个容器 (mongodb-seeder) 可以毫无问题地看到它?
编辑:我使用的是猫鼬 5.8.7
【问题讨论】:
标签: node.js mongodb docker mongoose docker-compose