Контейнерное ядро ​​.net, использующее Docker Compose, не разрешает имя контейнера MongoDb - PullRequest
0 голосов
/ 03 октября 2019

Я разработал в 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 запущен, как предложено в в этом вопросе , но безуспешно. Что-то должно отсутствовать в моем коде или файлах конфигурации докера, чтобы разрешить разрешение имен служб. Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Наконец, я нашел причину этого поведения после запуска System.Net.Dns.GetHostName() внутри кода моего модульного теста и проверки, что возвращаемое имя было именем хоста, а не именем контейнера. Я забыл упомянуть, что я запускал свой модульный тест из окна Test Explorer, и таким образом поддержка контейнера полностью игнорируется. В отличие от того, что я ожидал, Docker Compose не вызывается, поэтому ни контейнер MongoDb, ни контейнер проекта модульного тестирования не запускаются, проект модульного тестирования просто выполняется внутри хоста. Возможность запуска модульных тестов в контейнере, когда поддержка контейнера включена в Visual Studio, уже запрашивается на https://developercommunity.visualstudio.com/idea/554907/allow-running-unit-tests-in-docker.html. Пожалуйста, проголосуйте за эту функцию!

0 голосов
/ 03 октября 2019

Вы можете объявить сеть и связать IP-адрес для каждой службы, а затем использовать IP-адрес службы mongo вместо разрешения имени хоста:

version: '3.4'

services:
  myapp:
    image: ${DOCKER_REGISTRY-}myapp
    build:
      context: .
      dockerfile: myapp/Dockerfile
    depends_on:
      - mongo
    networks:
      mynetwork:
        ipv4_address: 178.25.0.3
  mongo:
    image: mongo:latest
    networks:
      mynetwork:
        ipv4_address: 178.25.0.2

networks:
  mynetwork:
    driver: bridge
    ipam:
      config:
      - subnet: 178.25.0.0/24

MongoClient("mongodb://178.25.0.2:27017");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...