Я использую экземпляр MongoDB 3.4.4 из официального образа докера на моей машине промежуточной среды.Я использую MongoDB.Driver NuGet пакет 2.5.0 для подключения из кода.Это работает нормально, когда я подключаюсь из развернутого приложения (работает в контейнере Docker из aspnetcore: базовый образ 2.0.3).У меня есть набор интеграционных тестов для моего приложения.В проекте приложения и тестовом проекте связь с созданием Mongo такая же, как показано ниже:
services.AddSingleton<IMongoClient>(s =>
{
var config = s.GetService<ISettings>();
var logger = s.GetService<ILogger<IMongoClient>>();
var settings = MongoClientSettings.FromUrl(new MongoUrl("mongodb://dev:pass@192.168.0.163/authDb?connect=direct"));
settings.MaxConnectionIdleTime = TimeSpan.FromSeconds(5);
settings.MaxConnectionPoolSize = 1000;
settings.MinConnectionPoolSize = 30;
if (config.ActiveLogMongoQueries)
{
settings.ClusterConfigurator = (cb) =>
{
cb.Subscribe<CommandStartedEvent>(
(e) =>
{
if (!IsServiceRequest(e.CommandName))
{
logger.LogInformation($"Mongo.Query DataBaseNameSpace: {e.DatabaseNamespace}. CommandName: {e.CommandName}. Command: {e.Command.ToString()}");
}
});
};
}
return new MongoClient(settings);
});
services.AddTransient(s =>
{
var config = s.GetService<ISettings>();
var dbName = "myDbName";
var mongoConnectionString = new MongoUrl(config.MongoConnectionString);
if (!string.IsNullOrEmpty(mongoConnectionString.DatabaseName))
{
dbName = mongoConnectionString.DatabaseName;
}
return s.GetService<IMongoClient>().GetDatabase(dbName);
});
Это также хорошо работает, когда я запускаю интеграционные тесты из Visual Studio IDE Runner.Но когда я пытаюсь запустить тестовый проект автоматически с помощью gitlab CI, у меня появляется ConnectionTimeoutExeption:
System.AggregateException : One or more errors occurred. (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 : "Direct", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "192.168.0.163:27017" }", EndPoint: "192.168.0.163:27017", State: "Disconnected", Type: "Unknown" }] }.) (The following constructor parameters did not have matching fixture data: MongoDatabaseFixture fixture)
---- 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 : "Direct", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "192.168.0.163:27017" }", EndPoint: "192.168.0.163:27017", State: "Disconnected", Type: "Unknown" }] }.
---- The following constructor parameters did not have matching fixture data: MongoDatabaseFixture fixture
Stack Trace:
----- Inner Stack Trace #1 (System.TimeoutException) -----
at MongoDB.Driver.Core.Clusters.Cluster.ThrowTimeoutException(IServerSelector selector, ClusterDescription description)
at MongoDB.Driver.Core.Clusters.Cluster.WaitForDescriptionChangedHelper.HandleCompletedTask(Task completedTask)
at MongoDB.Driver.Core.Clusters.Cluster.WaitForDescriptionChanged(IServerSelector selector, ClusterDescription description, Task descriptionChangedTask, TimeSpan timeout, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Clusters.Cluster.SelectServer(IServerSelector selector, CancellationToken cancellationToken)
at MongoDB.Driver.MongoClient.AreSessionsSupportedAfterServerSelection(CancellationToken cancellationToken)
at MongoDB.Driver.MongoClient.AreSessionsSupported(CancellationToken cancellationToken)
at MongoDB.Driver.OperationExecutor.StartImplicitSession(CancellationToken cancellationToken)
at MongoDB.Driver.MongoDatabaseImpl.UsingImplicitSession(Action`1 func, CancellationToken cancellationToken)
at MongoDB.Driver.MongoDatabaseImpl.DropCollection(String name, CancellationToken cancellationToken)
at IntegrationTests.MongoDatabaseFixture.DropPreviousTestData() in /builds/project/project-main/project.IntegrationTests/MongoDatabaseFixture.cs:line 40
----- Inner Stack Trace #2 (Xunit.Sdk.TestClassException) -----
Мой этап тестирования в gitlab-ci.yml выглядит следующим образом:
integrationtests:
image: microsoft/aspnetcore-build:1.0-2.0
stage: integrationtests
script:
- dotnet test -c Release ./$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj
tags:
- docker
only:
- schedules
Хост-машина 192.168.0.163 ОС - это Ubuntu, и она также содержит некоторые другие контейнеры-докеры, такие как clickhouse, и не имеет проблем с подключением к ним, пока тест выполняется на gitlab runner.
Я пытаюсь обновить MongoDb.Driver до последней версии 2.7.2, и она решаетпроблема.Но по ряду причин для меня лучше не обновлять версию драйвера.Я думаю, если код не выдает никаких исключений, когда он работает из запущенного приложения, то этот же код также отлично работает из тестов?Любые идеи, чтобы избежать этой проблемы без обновления библиотеки MongoDb и почему это происходит?Я также вижу этот пост Время ожидания соединения после обновления MongoDB.Driver с 2.7.0 до 2.7.1
Но если проблема связана с драйвером, почему приложение правильно работает со старымMongo.Driver библиотека?Большое спасибо!
Обновлено : Сегодня я пытаюсь воспроизвести шаги (если я правильно это сформулировал), выполненные Gitlab Runner.Я создаю тот же образ локально и запускаю его с докером на моем ПК.Я использую следующий .Dockerfile для сборки:
FROM microsoft/aspnetcore-build:1.0-2.0 as base
WORKDIR /app
EXPOSE 80
FROM base AS final
WORKDIR /Test
COPY ./Test /Test
ENTRYPOINT /bin/bash
Где «Test» - это папка моего решения.Затем я захожу в контейнер с помощью следующей команды:
docker run -it 2da12ce6cb7d
(имя, назначенное docker после сборки cmd) и пытаюсь выполнить - dotnet test -c Release ./ProjectName.IntegrationTests/ProjectName.IntegrationTests.csproj
и снова получить эти исключения.Итак, поскольку мое запущенное приложение (где соединение в порядке) использовало образ докера microsoft / aspnetcore: 2.0.3 в качестве базы, проблема, вероятно, в этом.