在 asp.net core 中构建和运行 docker 容器作为集成测试的一部分

问题描述

我对运行 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>

然后我“以代码 9009 退出”。

这个 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...