尝试到达Windows 10上的Docker Express API端点的连接重置错误

时间:2019-02-24 18:18:39

标签: docker express

我正在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对其进行了调试,并且可以正常工作。

docker.compose.yml文件

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}"

dockerfile

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

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

观看图像时,后端图像似乎不断地重新启动。

1 个答案:

答案 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