我正在Windows 10上运行Windows的Docker For Windows。我是Docker的新手,并在this tutorial之后创建了Express / Mongo API服务。
我使用以下命令启动图像:
docker-compose -f docker/docker-compose.yml up -d
容器旋转无误。但是,当尝试使用API时,我只会收到“连接重置”消息。我尝试了以下方法:
curl http://localhost:80
curl http://localhost:80/api/documents
curl http://127.0.0.1:80
curl http://127.0.0.1:80/api/documents
我尝试启动nginx
的映像并在端口80上运行,并用curl http://localhost:80
对其进行了调试,并且可以正常工作。
version: '3'
services:
backend:
build:
context: ../
dockerfile: docker/Dockerfile.production
args:
port: ${PORT}
env_file:
- ../.env
restart: always
ports:
- "${PORT}:${PORT}"
environment:
WAIT_HOSTS: database:27017
database:
image: mongo:4.0
env_file:
- ../.env
expose:
- 27017
command: "mongod --smallfiles --logpath=${MONGO_LOG_FILE}"
FROM node:10.12.0-alpine
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.2.1/wait /wait
RUN chmod +x /wait
WORKDIR /home/nodejs/app
ENV NODE_ENV prod
COPY package*.json ./
RUN npm install --only=production
ARG port=80
EXPOSE $port
COPY . ./
CMD /wait && node index.js
const express = require('express');
const bodyParser = require('body-parser');
const MongoClient = require('mongodb').MongoClient;
const dbName = process.env.NODE_ENV === 'dev' ? 'database-test' : 'database';
const url = `mongodb://${process.env.MONGO_INITDB_ROOT_USERNAME}:${process.env.MONGO_INITDB_ROOT_PASSWORD}@${dbName}:27017?authMechanism=SCRAM-SHA-1&authSource=admin`;
const options = {
useNewUrlParser: true,
reconnectTries: 60,
reconnectInterval: 1000
}
const routes = require('./routes/routes.js');
const port = process.env.PORT || 80;
const app = express();
const http = require('http').Server(app);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use('/api', routes);
app.use((req, res) => {
res.status(404);
})
MongoClient.connect(url, options, (err, database) => {
if (err) {
console.log(`FATAL MONGODB CONNECTION ERROR: ${err}:${err.stack}`);
process.exit(1);
}
app.locals.db = database.db('api');
http.listen(port, () => {
console.log("Listening on port " + port);
app.emit('APP_STARTED');
})
})
module.exports = app;
对于尝试的任何帮助和建议,我们将不胜感激。
更新
如果我使用docker run -d -p 27017:27017 mongo
单独启动mongodb,然后使用node index.js
运行我的express应用,一切似乎都可以正常工作。我使用docker-compose的方式似乎是这里的问题。当我通过docker ps
答案 0 :(得分:0)
我刚刚通过将 node.js 图像从 alpine
切换到 slim
解决了同样的问题。我调试了您描述的类似问题,似乎 mongodb 收到了请求,并且客户端在 mongo 响应时断开了连接。解决方案是一种解决方法,但我希望它可以帮助某人。
更新: 我搜索了一下,发现了潜在的问题:https://developer.mongodb.com/community/forums/t/docker-nodejs-alpine-distro-csfle-mongodb-enterprise-cryptd/6123/4