首页 > 解决方案 > 使用 docker-compose 重新启动容器时 MongoDB 未连接

问题描述

我正在尝试启动一个 docker 容器,该容器具有连接到 mongo 的应用程序。我正在关注 Brad Traversy 的 Docker 教程,因此代码仅来自他的 GitHub。现在我遇到的一个有趣的问题是,如果我启动一个全新的图像并启动它可以工作的容器。该应用程序部署,连接到 mongo,您可以向其添加数据,等等......

当我停止容器时(我只用 CTRL C、docker-compose down 和 docker desktop 尝试过)并尝试用 docker-compose up 再次启动它,它可能只工作 1/3 的时间。然后,如果我吹走图像并再次从头开始构建它,它就可以工作。停止容器并再次启动它,mongo 将无法连接给我以下错误:

docker-node-mongo | { MongoNetworkError: failed to connect to server [mongo:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 172.31.0.3:27017]
docker-node-mongo |     at Pool.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/topologies/server.js:562:11)
docker-node-mongo |     at Pool.emit (events.js:198:13)
docker-node-mongo |     at Connection.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/pool.js:316:12)
docker-node-mongo |     at Object.onceWrapper (events.js:286:20)
docker-node-mongo |     at Connection.emit (events.js:198:13)
docker-node-mongo |     at Socket.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/connection.js:245:50)
docker-node-mongo |     at Object.onceWrapper (events.js:286:20)
docker-node-mongo |     at Socket.emit (events.js:198:13)
docker-node-mongo |     at emitErrorNT (internal/streams/destroy.js:91:8)
docker-node-mongo |     at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
docker-node-mongo |     at process._tickCallback (internal/process/next_tick.js:63:19)
docker-node-mongo |   name: 'MongoNetworkError',
docker-node-mongo |   message:
docker-node-mongo |    'failed to connect to server [mongo:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 172.31.0.3:27017]',
docker-node-mongo |   errorLabels: [ 'TransientTransactionError' ],
docker-node-mongo |   [Symbol(mongoErrorContextSymbol)]: {} }

这是我的 compose.yml、docker 文件和 index.js,它连接到 mongo(同样,都是直接从 Brad 那里提取的):

码头工人-compose.yml

version: '3'
services:
  app:
    container_name: docker-node-mongo
    restart: always
    build: .
    ports:
      - '80:3000'
    external_links:
      - mongo
  mongo:
    container_name: mongo
    image: mongo
    ports:
      - '27017:27017'

Dockerfile

FROM node:10

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

索引.js

// Connect to MongoDB
mongoose
  .connect(
    'mongodb://mongo:27017/docker-node-mongo',
    { useNewUrlParser: true }
  )
  .then(() => console.log('MongoDB Connected'))
  .catch(err => console.log(err));

有没有人见过这个并且知道为什么 mongo 在停止和启动容器后只连接一半时间?如果这很重要,我在使用 Big Sur 作为操作系统的 Mac 上。

标签: mongodbdockerdocker-composedocker-container

解决方案


推荐阅读