Я провел небольшое исследование и обнаружил, что образы Windows и Linux для агентов, размещенных на Ms, имеют предустановленные Docker и Docker -Compose, поэтому с помощью этих агентов можно запускать контейнеры.
Моя проблема заключалась в том, что я не понимал, что команда Ops настроила агента Linux. Я пытался выполнить, используя именованный канал Windows, а не сокет Unix.
Я соответствующим образом изменил адрес Docker Engine API, и он сработал.
Вот мой код на случай, если кто-то заинтересован в создании интеграционных тестов, запускающих контейнеры для зависимостей микросервисов:
using Docker.DotNet;
using System;
using System.Runtime.InteropServices;
namespace Relationship.Promotion.Applier.IntegrationTest.Helpers
{
public class DockerClientFactory
{
private static readonly Uri defaultWindowsDockerEngineUri = new Uri("npipe://./pipe/docker_engine");
private static readonly Uri defaultLinuxDockerEngineUri = new Uri("unix:///var/run/docker.sock");
public static DockerClient CreateInstance()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
return new DockerClientConfiguration(defaultWindowsDockerEngineUri).CreateClient();
else
return new DockerClientConfiguration(defaultLinuxDockerEngineUri).CreateClient();
}
}
}
namespace Relationship.Promotion.Applier.IntegrationTest
{
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class
{
private readonly DockerClient dockerClient;
private readonly PromotionContainer promotionContainer;
private readonly StoreContainer storeContainer;
private readonly ConversionContainer conversionContainer;
public CustomWebApplicationFactory()
{
try
{
// Alternative to Docker.DotNet
// https://github.com/Deffiss/testenvironment-docker
dockerClient = DockerClientFactory.CreateInstance();
DockerContainerBase.CleanupOrphanedContainers(dockerClient).Wait(300.Seconds());
if (!dockerClient.Networks.ListNetworksAsync().Result.Select(n => n.Name).Contains("boti-network"))
{
var result = dockerClient.Networks.CreateNetworkAsync(new Docker.DotNet.Models.NetworksCreateParameters()
{
Name = "boti-network",
Driver = "bridge"
}).Result;
}
promotionContainer = new PromotionContainer(imageName: "promotion-engine-promotion-api");
promotionContainer.Start(dockerClient).Wait(300.Seconds());
conversionContainer = new ConversionContainer(imageName: "promotion-engine-conversion-api");
conversionContainer.Start(dockerClient).Wait(300.Seconds());
storeContainer = new StoreContainer("promotion-engine-store-api");
storeContainer.Start(dockerClient).Wait(300.Seconds());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
}
protected override IWebHostBuilder CreateWebHostBuilder()
{
return base.CreateWebHostBuilder().UseEnvironment("Docker");
}
protected override void Dispose(bool itIsSafeToAlsoFreeManagedObjects)
{
if (!itIsSafeToAlsoFreeManagedObjects) return;
promotionContainer.Remove(dockerClient).Wait(300.Seconds());
conversionContainer.Remove(dockerClient).Wait(300.Seconds());
storeContainer.Remove(dockerClient).Wait(300.Seconds());
dockerClient.Dispose();
base.Dispose(itIsSafeToAlsoFreeManagedObjects);
}
}
}