问题描述
我对运行 HostedService 的 asp.net core 3.1 应用进行了集成测试。作为集成测试过程的一部分,我想在测试开始之前构建一个 docker 容器。我尝试在测试项目配置中添加以下命令:
<Target Name="Test" AfterTargets="Build">
<Exec command="docker run --rm -p 3030:3030 -v $PWD/mocks:/app/mocks dotronglong/faker:stable" />
</Target>
它返回“exited with code 127”,所以我把它改成:
<Target Name="Test" AfterTargets="Build">
<Exec command="C:\Program Files\Docker\Docker\resources\bin\docker run --rm -p 3030:3030 -v $PWD/mocks:/app/mocks dotronglong/faker:stable" />
</Target>
这个 docker 容器依赖于“mocks”,所以我将项目设置为:
<ItemGroup>
<None Update="mocks\api.json">
<copyToOutputDirectory>Always</copyToOutputDirectory>
</None>
</ItemGroup>
总的来说,这是运行 docker 容器进行集成测试的正确方法吗?考虑到此测试将在 CI/CD 中运行,因此用于运行 docker 的路径也很重要。
解决方法
您可以使用 Docker.DotNet 从 Docker 映像创建和运行容器。 对于创建容器:
var address = Environment.OSVersion.Platform == PlatformID.Unix
? new Uri("unix:///var/run/docker.sock")
: new Uri("npipe://./pipe/docker_engine");
var config = new DockerClientConfiguration(address);
var dockerClient = config.CreateClient();
await dockerClient.Containers.CreateContainerAsync(
new CreateContainerParameters
{
Image = "image_name",Name = "container_name"
});
然后就可以启动容器了:
await dockerClient.Containers.StartContainerAsync("container_name",new ContainerStartParameters { });
有关详细信息,请参阅 here。