【问题标题】:Webapi doest not see MongoDB in docker-composeWebapi 在 docker-compose 中看不到 MongoDB
【发布时间】:2019-09-18 16:57:13
【问题描述】:

我正在运行包含我的 WebApi 和 MongoDB 的 docker-compose 文件 我已经创建了以下 docker-compose 文件,但是当我运行它时,我无法执行任何请求。

这是我的 docker compose 文件:

version: '3.1'
services:
mongo:
    image: mongo
    restart: always
    environment:
      MONGODB_USER: "admin"
      MONGODB_DATABASE: "BooksDB"
      MONGODB_PASS: "pass"
    ports:
      - 27017:27017
mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    depends_on:
      - mongo
webapi:
    build: .
    restart: always
    ports:
      - 5000:80
    environment:
      MongoDB__Host: mongo
    depends_on:
    - mongo

我在 docker 容器日志中收到以下错误:

fail: Microsoft.AspNetCore.Server.Kestrel[13]
  Connection id "0HLPSARCVM003", Request id "0HLPSARCVM003:00000001": An unhandled exception was thrown by the  application.
System.TimeoutException: A timeout occured after 30000ms selecting a   server using CompositeServerSelector{ Selectors =   MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector,   LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 }   }. Client view of cluster state is { ClusterId : "1", ConnectionMode :   "Automatic", Type : "Unknown", State : "Disconnected", Servers : [{   ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/localhost:27017" }",     EndPoint: "Unspecified/localhost:27017", State: "Disconnected", Type:       "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException:        An exception occurred while opening a connection to the server. --->      System.Net.Sockets.SocketException: Cannot assign requested address
     at System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP,      Boolean flowContext, AsyncCallback callback, Object state)
     at System.Net.Sockets.Socket.UnsafeBeginConnect(EndPoint    remoteEP, AsyncCallback callback, Object state, Boolean flowContext)
     at System.Net.Sockets.Socket.BeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state)

在 System.Net.Sockets.Socket.ConnectAsync(EndPoint remoteEP) 在 MongoDB.Driver.Core.Connections.TcpStreamFactory.ConnectAsync(套接字套接字,端点端点,CancellationToken 取消令牌) 在 MongoDB.Driver.Core.Connections.TcpStreamFactory.CreateStreamAsync(端点端点,CancellationToken 取消令牌) 在 MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelperAsync(CancellationToken cancelToken) --- 内部异常堆栈跟踪结束 ---

你知道我应该在那些 docker-compose 文件中改变什么吗?

【问题讨论】:

  • 你解决了吗?

标签: c# mongodb docker .net-core docker-compose


【解决方案1】:

问题是您在 webapi 配置中指的是localhost。请将其替换为 mongoDB 的 docker 主机名,在本例中为 mongo:27017

【讨论】:

  • hm 我更改了应用程序 settings.json 但问题仍然存在。 "ConnectionString": "mongodb://mongo:27017",
  • 是否仍然显示相同的错误?请分享您遇到的新错误
【解决方案2】:

问题似乎不在于您的 docker-compose 文件,而在于您在 webapi 服务中编写的代码。 您发布的日志显示有关“localhost:27017”端点的异常,并且 webapi 不应该查找 MongoDB 的 localhost。而是尝试使用您设置的环境变量:

    environment:
      MongoDB__Host: mongo

这意味着 webapi 应该查看 mongo:27017 而不是 localhost:27017。但是不要硬编码 mongo:27017,而是从环境中读取。原因是您定义的每个服务在桥接网络上都有自己的 IP 和主机名。事实上,您没有理由在 docker-compose 文件中公开 27017 端口,因为通信将直接在服务之间的桥接网络上进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-07
    • 2021-06-24
    • 1970-01-01
    • 2021-09-08
    • 2019-12-08
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多