我们有一个 docker compose,需要它来测试我们的代码。当我们在本地(macOS,不同的主机)运行它时,它工作正常,但是一旦我们在 GitHub 操作运行器上运行它,它就会失败并显示
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=5678): Max retries exceeded with url: /api/v1/credentials (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f3d28e3d810>: Failed to establish a new connection: [Errno 111] Connection refused'))
受影响的服务是一个 n8n 容器,它应该公开一个 HTTP API,该 API 也可以在本地运行。
n8n:
image: docker.n8n.io/n8nio/n8n
ports:
- "5678:5678"
environment:
- N8N_HOST=n8n:5678
- N8N_PORT=5678
- N8N_PROTOCOL=http
- NODE_ENV=production
- DB_TYPE=postgresdb
- DB_TABLE_PREFIX=n8n_
- DB_POSTGRESDB_DATABASE=n8n
volumes:
- ./DOCKER/n8n/data:/home/node/.n8n
- ./DOCKER/n8n/files:/files
我们尝试使用 Python requests 库通过 FastAPI API 来访问它。这两个系统之间有什么区别? docker compose 是相同的,env 文件正在由我们的测试脚本重置。
更新
我将可重现的问题最小化为以下内容:
curl --fail http://localhost:8080 || exit 1
curl --fail http://localhost:5678/api/v1/docs/ || exit 1
在我的 docker compose 中,我有两个服务,一个在 8080 上工作,另一个在 n8n 上不工作。上面的代码在第二行失败,并出现错误
curl: (7) Failed to connect to localhost port 5678 after 0 ms: Connection refused
。我还尝试切换端口,以防 GitHub 操作已使用此端口。
编辑代码以使用主机 n8n 而不是 localhost。
该服务绑定到名为 n8n 的主机,而不是 localhost。
如果您将作业配置为在容器中运行,或者您的步骤使用容器操作,则无需映射端口来访问服务或操作。 Docker 自动公开同一 Docker 用户定义的桥接网络上容器之间的所有端口。您可以通过主机名直接引用服务容器。主机名会自动映射到您在工作流程中为服务配置的标签名称。