luk*_*ker 5 mongodb node.js express docker apple-m1
我目前正在尝试使用 M1 芯片将 Node 容器连接到 Mongo 容器。许多人说您无法在 M1 Mac 上运行 Mongo 4.9+,因为不支持 AVR。我不知道为什么,但在我的 M1 上 mongo 运行得很好。我可以使用 mongo://mongo:27017 通过 Mongo Compass 连接到容器。此外,如果我在 docker 之外运行 Node 应用程序,我可以使用相同的连接字符串连接到 Mongo 容器。但由于某种原因,我无法将容器化节点应用程序连接到容器化 Mongo 服务。
Dockerfile
FROM node:12
# Create app directory
WORKDIR /usr/src/app
# Copy dependencies
COPY package*.json ./
# Install dependencies
RUN npm install
RUN npm ci --only=production
# Bundle app source
COPY . .
EXPOSE 3000
CMD [ "node", "server.js" ]
Run Code Online (Sandbox Code Playgroud)
docker-compose.yml
version: "2"
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- mongo
mongo:
image: mongo
ports:
- "27017:27017"
Run Code Online (Sandbox Code Playgroud)
连接方式
/* Mongoose Connection */
const mongoose = require('mongoose')
mongoose.Promise = global.Promise
mongoose.connect(
'mongodb://mongo:27017',
{ useNewUrlParser: true }
)
mongoose.connection.on('error', console.error.bind(console, 'MongoDB connection
Run Code Online (Sandbox Code Playgroud)
错误:'))
mongoose.set('debug', true)
module.exports = mongoose.connection
Run Code Online (Sandbox Code Playgroud)
服务器.js
FROM node:12
# Create app directory
WORKDIR /usr/src/app
# Copy dependencies
COPY package*.json ./
# Install dependencies
RUN npm install
RUN npm ci --only=production
# Bundle app source
COPY . .
EXPOSE 3000
CMD [ "node", "server.js" ]
Run Code Online (Sandbox Code Playgroud)
错误
redditjspart2-web-1 | Reddit Search listening on port localhost:3000!
redditjspart2-web-1 | MongoDB connection Error: { MongoNetworkError: failed to connect to server [127.0.0.1:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]
redditjspart2-web-1 | at Pool.<anonymous> (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/topologies/server.js:438:11)
redditjspart2-web-1 | at Pool.emit (events.js:198:13)
redditjspart2-web-1 | at createConnection (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/connection/pool.js:561:14)
redditjspart2-web-1 | at connect (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/connection/pool.js:994:11)
redditjspart2-web-1 | at makeConnection (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/connection/connect.js:31:7)
redditjspart2-web-1 | at callback (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/connection/connect.js:264:5)
redditjspart2-web-1 | at Socket.err (/usr/src/app/node_modules/mongoose/node_modules/mongodb/lib/core/connection/connect.js:294:7)
redditjspart2-web-1 | at Object.onceWrapper (events.js:286:20)
redditjspart2-web-1 | at Socket.emit (events.js:198:13)
redditjspart2-web-1 | at emitErrorNT (internal/streams/destroy.js:91:8)
redditjspart2-web-1 | at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
redditjspart2-web-1 | at process._tickCallback (internal/process/next_tick.js:63:19)
redditjspart2-web-1 | name: 'MongoNetworkError',
redditjspart2-web-1 | [Symbol(mongoErrorContextSymbol)]: {} }
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
该错误表明它正在尝试连接到 127.0.0.1:27017,这意味着它正在正确解析主机名并将其映射到我的本地主机。所以Node容器肯定能找到它。这也是有道理的,因为我仍然可以从 Node 容器 ping Mongo 容器,正如我之前提到的。看起来 Mongo 只是出于某种原因拒绝连接。
我真的很难弄清楚为什么会出现这种情况。我的存储库的链接是公开的,您可以在 github 上找到它: https: //github.com/lukeaparker/reddit.jspart2
非常感谢!!
小智 5
我在 M1 Mac 上遇到了类似的问题,并通过将这些配置放入 docker-compose.yml 中来解决它:
services:
mongodb:
image: arm64v8/mongo:4.0
platform: linux/arm64/v8
Run Code Online (Sandbox Code Playgroud)
自从我之前收到此警告以来,我还通过 CLI 使用docker build --platform linux/arm64/v8和来实现平台明确性:docker run --platform linux/arm64/v8
警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配,并且未请求特定平台
| 归档时间: |
|
| 查看次数: |
5578 次 |
| 最近记录: |