"Connection closed" 在 Mac 上从 Docker 中的 node.js 访问 Docker 中的 neo4j
"Connection closed" accessing neo4j in Docker from node.js in Docker on Mac
我运行正在 Docker 容器中安装一个 neo4j 数据库和一个 node.js api。在启动时,api 尝试将大量数据导入 neo4j,通过 neo4-driver 访问它。我还可以 运行 从 Docker 容器内部或外部(本地)手动导入这些内容。
这曾经工作得很好。它在 Windows 上工作正常,它对其他使用 Mac 书的人工作正常,并且 有时 它对我也工作,但随后连接神秘地断开并且在我重新启动容器之前,我只会收到 ECONNREFUSED
错误。 neo4j 和 Docker 都没有给出任何错误的迹象。日志中没有任何内容,它们似乎没有崩溃,只是无法访问。端口 7474 上的 neo4j 浏览器界面也不见了,虽然它曾经在那里。
这有时会奏效这一事实令人费解。但在我再次收到错误之前,它永远不会工作很长时间。当它下降时,我经常(不总是)首先得到一个 EPIPE
错误。
我以前运行Docker/docker桌面版3.1和10.20.2,现在升级到3.6.0和10.20.8。 Neo4j 版本 3。Alpine 上的 api 运行s。
我使用 docker-compose -p 7687:7687 -f ./docker-compose.yml up
启动 Docker,我的 docker-compose.yml 文件如下所示:
version: '3'
services:
neo4j:
build:
context: ./db/
ports:
- "7474:7474"
- "7687:7687"
api:
build:
context: ./api/
volumes:
- ./api/:/code/
depends_on:
- neo4j
ports:
- "3000:3000"
我执行对 neo4j 的查询:
const session = driver.session();
session.writeTransaction((tx) => tx.run(query, params))
其中 driver
之前用
初始化
const driver = neo4j.driver(neo4jUrl, neo4j.auth.basic(user, passwd), {});
最常见的错误是:
Neo4jError: connect ECONNREFUSED 172.20.0.2:7687
at captureStacktrace (/code/node_modules/neo4j-driver/lib/v1/result.js:199:15)
at new Result (/code/node_modules/neo4j-driver/lib/v1/result.js:65:19)
at _newRunResult (/code/node_modules/neo4j-driver/lib/v1/transaction.js:354:10)
at Object.run (/code/node_modules/neo4j-driver/lib/v1/transaction.js:238:14)
at Transaction.run (/code/node_modules/neo4j-driver/lib/v1/transaction.js:104:26)
...
at TransactionExecutor._safeExecuteTransactionWork (/code/node_modules/neo4j-driver/lib/v1/internal/transaction-executor.js:134:22)
at TransactionExecutor._executeTransactionInsidePromise (/code/node_modules/neo4j-driver/lib/v1/internal/transaction-executor.js:122:32)
at Timeout._onTimeout (/code/node_modules/neo4j-driver/lib/v1/internal/transaction-executor.js:98:18)
at listOnTimeout (internal/timers.js:557:17) {
code: 'ServiceUnavailable'
我怀疑这可能与 Windows 和 Mac 之间的 Docker 差异有关,但我不确定。它也适用于其他 Mac 用户,偶尔对我有用,只是时间不长。那么什么会导致此连接突然中断?
这个问题似乎与您的环境有关,而不是与容器有关。
你能检查一下吗:
可用的计算机资源:RAM 和 CPU
You can limit CPU/RAM usage of a container with docker-compose --compatibility
https://docs.docker.com/compose/compose-file/compose-file-v3/#deploy
services:
app:
...
deploy:
resources:
limits:
memory: 2g
cpus: '1.4'
OS 版本:容器与您的 OS 共享内核,旧内核(或全新)可能会对您的容器产生影响。
Docker 版本:这个过程 运行 是你的容器,但是你已经升级了它。
网络:我遇到过我的容器使用的 IP 与现有 IP 冲突的问题,您可以为您的容器强制使用一个 IP。
https://docs.docker.com/compose/compose-file/compose-file-v3/#ipam
services:
app:
networks:
- backend
networks:
backend:
ipam:
driver: default
config:
- subnet: "10.8.0.0/24"
编辑 1
EPIPE 错误实际上可能是主要问题。
您可以尝试增加 docker 桌面中的资源限制吗?
Docker Desktop -> Settings -> Resources -> Advanced
编辑 2
您无法从您的主机中找到 neo4j 主机名是正常的。
- 容器内的 Neo4j 运行
neo4j
主机名是一种 docker 机制,适用于同一 docker 网络中的其他容器。
- 在 docker 之外,尝试连接到
localhost
或 127.0.0.1
- 关于您的撰写文件,端口已经公开。
我运行正在 Docker 容器中安装一个 neo4j 数据库和一个 node.js api。在启动时,api 尝试将大量数据导入 neo4j,通过 neo4-driver 访问它。我还可以 运行 从 Docker 容器内部或外部(本地)手动导入这些内容。
这曾经工作得很好。它在 Windows 上工作正常,它对其他使用 Mac 书的人工作正常,并且 有时 它对我也工作,但随后连接神秘地断开并且在我重新启动容器之前,我只会收到 ECONNREFUSED
错误。 neo4j 和 Docker 都没有给出任何错误的迹象。日志中没有任何内容,它们似乎没有崩溃,只是无法访问。端口 7474 上的 neo4j 浏览器界面也不见了,虽然它曾经在那里。
这有时会奏效这一事实令人费解。但在我再次收到错误之前,它永远不会工作很长时间。当它下降时,我经常(不总是)首先得到一个 EPIPE
错误。
我以前运行Docker/docker桌面版3.1和10.20.2,现在升级到3.6.0和10.20.8。 Neo4j 版本 3。Alpine 上的 api 运行s。
我使用 docker-compose -p 7687:7687 -f ./docker-compose.yml up
启动 Docker,我的 docker-compose.yml 文件如下所示:
version: '3'
services:
neo4j:
build:
context: ./db/
ports:
- "7474:7474"
- "7687:7687"
api:
build:
context: ./api/
volumes:
- ./api/:/code/
depends_on:
- neo4j
ports:
- "3000:3000"
我执行对 neo4j 的查询:
const session = driver.session();
session.writeTransaction((tx) => tx.run(query, params))
其中 driver
之前用
const driver = neo4j.driver(neo4jUrl, neo4j.auth.basic(user, passwd), {});
最常见的错误是:
Neo4jError: connect ECONNREFUSED 172.20.0.2:7687
at captureStacktrace (/code/node_modules/neo4j-driver/lib/v1/result.js:199:15)
at new Result (/code/node_modules/neo4j-driver/lib/v1/result.js:65:19)
at _newRunResult (/code/node_modules/neo4j-driver/lib/v1/transaction.js:354:10)
at Object.run (/code/node_modules/neo4j-driver/lib/v1/transaction.js:238:14)
at Transaction.run (/code/node_modules/neo4j-driver/lib/v1/transaction.js:104:26)
...
at TransactionExecutor._safeExecuteTransactionWork (/code/node_modules/neo4j-driver/lib/v1/internal/transaction-executor.js:134:22)
at TransactionExecutor._executeTransactionInsidePromise (/code/node_modules/neo4j-driver/lib/v1/internal/transaction-executor.js:122:32)
at Timeout._onTimeout (/code/node_modules/neo4j-driver/lib/v1/internal/transaction-executor.js:98:18)
at listOnTimeout (internal/timers.js:557:17) {
code: 'ServiceUnavailable'
我怀疑这可能与 Windows 和 Mac 之间的 Docker 差异有关,但我不确定。它也适用于其他 Mac 用户,偶尔对我有用,只是时间不长。那么什么会导致此连接突然中断?
这个问题似乎与您的环境有关,而不是与容器有关。
你能检查一下吗:
可用的计算机资源:RAM 和 CPU
You can limit CPU/RAM usage of a container with docker-compose --compatibility
https://docs.docker.com/compose/compose-file/compose-file-v3/#deploy
services: app: ... deploy: resources: limits: memory: 2g cpus: '1.4'
OS 版本:容器与您的 OS 共享内核,旧内核(或全新)可能会对您的容器产生影响。
Docker 版本:这个过程 运行 是你的容器,但是你已经升级了它。
网络:我遇到过我的容器使用的 IP 与现有 IP 冲突的问题,您可以为您的容器强制使用一个 IP。
https://docs.docker.com/compose/compose-file/compose-file-v3/#ipam
services: app: networks: - backend networks: backend: ipam: driver: default config: - subnet: "10.8.0.0/24"
编辑 1
EPIPE 错误实际上可能是主要问题。
您可以尝试增加 docker 桌面中的资源限制吗?
Docker Desktop -> Settings -> Resources -> Advanced
编辑 2
您无法从您的主机中找到 neo4j 主机名是正常的。
- 容器内的 Neo4j 运行
neo4j
主机名是一种 docker 机制,适用于同一 docker 网络中的其他容器。- 在 docker 之外,尝试连接到
localhost
或127.0.0.1
- 关于您的撰写文件,端口已经公开。