Я разработал в Visual Studio 2017 (версия 15.9.16) простой проект модульного тестирования .Net Core 2.2, который подключается к экземпляру MongoDb, включающему поддержку Container Orchrestation. Моя цель - запустить контейнер с экземпляром MongoDb, к которому юнит-тесты будут подключаться всякий раз, когда они запускаются из окна Test Explorer. Проблема, с которой я сталкиваюсь, заключается в том, что из кода модульного теста, который я не могу подключить к контейнеру MongoDb, имя службы, определенное в docker-compose.yml, не может быть разрешено.
Вот содержимое docker-compose. файл yml:
version: '3.4'
services:
myapp:
image: ${DOCKER_REGISTRY-}myapp
build:
context: .
dockerfile: myapp/Dockerfile
depends_on:
- mongo
mongo:
image: mongo:latest
Содержимое Dockerfile приложения следующее:
FROM microsoft/dotnet:2.2-runtime AS base
WORKDIR /app
FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY myapp/myapp.csproj myapp/
RUN dotnet restore myapp/myapp.csproj
COPY . .
WORKDIR /src/myapp
RUN dotnet build myapp.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish myapp.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "myapp.dll"]
Внутри кода модульного теста, если я пытаюсь подключиться к экземпляру MongoDb с помощью var client = new MongoClient("mongodb://mongo:27017");
при попытке записи в базу данных я получаю следующее исключение:
Тайм-аут произошел после 30000 мс, когда сервер выбирается с помощью CompositeServerSelector {Selectors = MongoDB.Driver.MongoClient + AreSessionsSupportedServerSelector, LatencyLimitingSerlowedaten {Allowedaten {Allowedaten {Allowedaten_ {}: 00: 00.0150000}}. Клиентское представление состояния кластера: {ClusterId: "1", ConnectionMode: "Automatic", тип: "Unknown", состояние: "Disconnected", серверы: [{ServerId: "{ClusterId: 1, EndPoint:" Unspecified / mongo:27017 "}", конечная точка: "Unspecified / mongo: 27017", состояние: "Disconnected", тип: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: возникла исключительная ситуация при открытии соединения с сервером. ---> System.Net.Sockets.SocketException: неизвестный хост в System.Net.Dns.HostResolutionEndHelper (IAsyncResult asyncResult) в System.Net.Dns.EndGetHostAddresses (IAsyncResult asyncResult) в System.Net.Dns. <> C.sync1) в System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic (IAsyncResult iar, Func`2 endFunction, Action`1 endAction, обещание Task`1, логическое значение требует синхронизация) --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение -- в MongoDB.Driver.Core.Connections.TcpStreamFactory.ResolveEndPointsAsync (конечная точка инициализации) в MongoDB.Driver.Core.Connections.TcpStreamFactory.CreateStreamAsync (EndPoint endPoint, CancellationToken cancellationToken) в MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelperAsync (CancellationToken cancellationToken) --- Конец внутренней трассировки стека исключений - в точке Монго.Connections.BinaryConnection.OpenHelperAsync (CancellationToken cancellationToken) в MongoDB.Driver.Core.Servers.ServerMonitor.HeartbeatAsync (CancellationToken cancellationToken) ", LastUpdateTimestamp:" 2019-10-03T10}: 101 * 00.
Если я пытаюсь разрешить имя службы контейнера MongoDb, используя System.Net.Dns.GetHostEntry("mongo")
, я получаю следующее исключение:
System.Net.SocketException: 'Неизвестный хост'
Мне кажется, что код .Net Core внутри контейнера модульного тестирования не может разрешать имена сервисов docker-compose.yml. С другой стороны, если я начну сеанс в контейнере модульного тестирования, я могу сделать ping mongo
или telnet mongo 27017
с успехом. Я также пытался убедиться, что контейнер MongoDb запущен, как предложено в в этом вопросе , но безуспешно. Что-то должно отсутствовать в моем коде или файлах конфигурации докера, чтобы разрешить разрешение имен служб. Любая помощь будет высоко ценится.