使用docker-compose和dotnet core时,MongoDB连接超时

4

我正在使用dotnet core 2.2开发WebAPI服务。 我使用Docker桌面版在Windows上运行Linux容器。以下是我的docker-compose文件:

version: '3.4'

services:
  mongo:
    image: mongo
    ports:
      - 27017:27017
  mongo-express:
    image: mongo-express
    ports:
      - 8088:8081
    depends_on:
      - mongo
  MyWebApi:
    image: MyWebApi
    build:
      context: .
      dockerfile: MyWebApi/Dockerfile
    ports:
      - 80:80
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=http://+:5003
    depends_on:
      - mongo

并且这是我的web api的Dockerfile:

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
#EXPOSE 443

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ["TMSApi/TMSApi.csproj", "TMSApi/"]
COPY ["BusinessEntities/BusinessEntities.csproj", "BusinessEntities/"]
COPY ["TMSService/TMSService.csproj", "TMSService/"]
COPY ["TMSRepository/TMSRepository.csproj", "TMSRepository/"]
RUN dotnet restore "TMSApi/TMSApi.csproj"
COPY . .
WORKDIR "/src/TMSApi"
RUN dotnet build "TMSApi.csproj" -c Debug -o /app

FROM build AS publish
RUN dotnet publish "TMSApi.csproj" -c Debug -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "TMSApi.dll", "--environment=Development"]

在我的WebAPI appsettings.json文件中,我使用以下连接字符串:

mongodb://mongo:27017

在docker-compose文件中,我有3个服务:mongo、mongo-express和MyWebApi。当我使用localhost:8088时,mongo-express连接到mongo。
但是,当MyWebApi尝试连接到mongo服务时,出现超时错误。
你有什么想法如何解决这个问题吗?我想继续在docker容器内运行它。
我发现了一些最近关于这个主题的文章,但没有结果...
谢谢
2个回答

2
我已经解决了我的问题。
在堆栈跟踪中,Web API 尝试访问 mongotms 主机而非 mongo。昨天早上我进行了一项测试,更改了服务名称和设置,从 mongo 更改为 mongotms,然后构建了镜像。但是,之后我改变了主意并回滚了更改,重新构建了镜像,但它仍然保留了旧的 mongo 服务名称。"最初的回答"

0

您的 docker-compose.yml 文件是正确的,使用的 URL 也是正确的。我认为问题在于 - mongo 启动所需的时间比 YourWebApi 更长,您可能正在尝试连接数据库时它还没有准备好。

depends_on 字段仅控制启动顺序,但并不保证服务已经准备就绪。

因此,请在应用程序中设置一些超时时间。如果可行,则引入 wait-for 方法 - 等待远程套接字打开。这是解决您问题的标准方法。


我不认为这是解决方案。Mongo已经启动,mongo-express可以直接连接到Mongo数据库。我的API还有常规控制器和静态页面,在调用API之前等待了很长时间。 - Whiletrue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接