首页 > 解决方案 > 如何通过节点容器使用 mongoose 安全地连接到 mongo docker 容器以进行生产?

问题描述

这是我的 docker-compose.production.yml。

version: "3.7"
services:
##############################
# Back-End Container
##############################
  backend:
    container_name: mern_backend
    init: true
    environment:
      - MONGO_URI=mongodb://root_username:super_secret_pass@mongo_db:27017/mern_db?authSource=admin
#     - MONGO_URI=mongodb://mongo_db:27017/mern_db
    restart: always
    depends_on:
      - db
    networks:
      - server
##############################
# MongoDB Container
##############################
  db:
    container_name: mongo_db
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root_username
      MONGO_INITDB_ROOT_PASSWORD: super_secret_pass
    volumes:
      - dbdata:/data/db/
    networks:
      - server
networks:
  server:
volumes:
  dbdata:

在来自 node.js/express 容器的 app.js 中,我执行以下操作。

// Database Setup
mongoose.connect((process.env.MONGO_URI), { useNewUrlParser: true });

// Mongoose Setup
const db = mongoose.connection;
db.on('error', console.error.bind( console, 'Connection Error:' ))
  .once('open', function() { console.log('Database Connected!') });

有时我会收到此错误:

Connection Error: admin { MongoNetworkError: failed to connect to server [mern_db:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 172.27.0.2:27017]
Pool.<anonymous> (/home/node/node_modules/mongodb-core/lib/topologies/server.js:564:11)
Pool.emit (events.js:197:13)
Connection.<anonymous> (/home/node/node_modules/mongodb-core/lib/connection/pool.js:317:12)
Object.onceWrapper (events.js:285:13)
Connection.emit (events.js:197:13)
Socket.<anonymous> (/home/node/node_modules/mongodb-core/lib/connection/connection.js:246:50)
Object.onceWrapper (events.js:285:13)
Socket.emit (events.js:197:13)
emitErrorNT (internal/streams/destroy.js:82:8)
emitErrorAndCloseNT (internal/streams/destroy.js:50:3)
processTicksAndRejections (internal/process/next_tick.js:76:17)
name: 'MongoNetworkError',
errorLabels: [ 'TransientTransactionError' ],
[Symbol(mongoErrorContextSymbol)]: {} }

有时我会收到此错误:

Connection Error: admin { MongoError: Authentication failed.
/home/node/node_modules/mongodb-core/lib/connection/pool.js:581:63
authenticateStragglers (/home/node/node_modules/mongodb-core/lib/connection/pool.js:504:16)
Connection.messageHandler (/home/node/node_modules/mongodb-core/lib/connection/pool.js:540:5)
emitMessageHandler (/home/node/node_modules/mongodb-core/lib/connection/connection.js:310:10)
Socket.<anonymous> (/home/node/node_modules/mongodb-core/lib/connection/connection.js:453:17)
Socket.emit (events.js:197:13)
addChunk (_stream_readable.js:288:12)
readableAddChunk (_stream_readable.js:269:11)
Socket.Readable.push (_stream_readable.js:224:10)
TCP.onStreamRead (internal/stream_base_commons.js:145:17)
ok: 0,
errmsg: 'Authentication failed.',
code: 18,
codeName: 'AuthenticationFailed',
name: 'MongoError',
[Symbol(mongoErrorContextSymbol)]: {} }

我也按照本教程进行操作,但无济于事。我尝试阅读mongo 图像文档,但老实说,我不明白它是如何工作的。我最近了解到 OS X 无法将数据目录映射到主机,但我认为数据量仍然无法正常工作。


我做到了docker-compose up,它有时没有错误,而其他人则有错误。我这样做docker system prune了,尝试从 docker-compose.yml 文件中删除 volumes 行,但到目前为止没有任何效果。我使用了两个 MONGO_URI 环境变量,每个都给了我一个错误。

标签: node.jsmongodbdocker

解决方案


推荐阅读