Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Docker.DotNet xUnit测试错误,无法分配请求的地址/var/run/Docker.sock_C#_Docker_.net Core - Fatal编程技术网

C# Docker.DotNet xUnit测试错误,无法分配请求的地址/var/run/Docker.sock

C# Docker.DotNet xUnit测试错误,无法分配请求的地址/var/run/Docker.sock,c#,docker,.net-core,C#,Docker,.net Core,版本 Docker引擎CE v19.03.8 dotnetsdkv3.1.301 Docker.DotNet v3.125.2 xUnit v2.4.0 设置 我正在使用Docker.DotNet包管理ASP.NET核心API项目中功能测试的容器依赖项 我使用了这个blog()中的代码,创建了一个类来管理我的测试项目中与Docker API的交互——我在文章末尾添加了这段代码,因为它相对较长 问题 当我从终端运行dotnet test命令时,一切正常。但是,我想在构建Dockerfile时运

版本

  • Docker引擎CE v19.03.8
  • dotnetsdkv3.1.301
  • Docker.DotNet v3.125.2
  • xUnit v2.4.0
设置

我正在使用Docker.DotNet包管理ASP.NET核心API项目中功能测试的容器依赖项

我使用了这个blog()中的代码,创建了一个类来管理我的测试项目中与Docker API的交互——我在文章末尾添加了这段代码,因为它相对较长

问题

当我从终端运行
dotnet test
命令时,一切正常。但是,我想在构建
Dockerfile
时运行这些测试

当我运行
docker build-t我的项目时。
我得到以下错误:

System.Net.Http.HttpRequestException:连接失败 ----System.Net.Internals.SocketExceptionFactory+ExtendedSocketException:无法分配请求的地址/var/run/docker.sock 堆栈跟踪: 位于Microsoft.Net.Http.Client.ManagedHandler.ProcessRequestAsync(HttpRequestMessage请求,CancellationToken CancellationToken) 位于Microsoft.Net.Http.Client.ManagedHandler.SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken) 在Docker.DotNet.DockerClient.PrivateMakeRequestAsync的System.Net.Http.HttpClient.FinishSendAsyncBuffered(任务
1 sendTask,HttpRequestMessage请求,取消令牌源cts,布尔处理)中(TimeSpan超时、HttpCompletionOption completionOption、HttpMethod方法、字符串路径、IQueryString查询字符串、IDictionary
2头、IRequestContent数据、CancellationToken CancellationToken) Docker.DotNet.DockerClient.PrivateMakeRequestAsync(TimeSpan超时、HttpCompletionOption completionOption、HttpMethod方法、字符串路径、IQueryString查询字符串、IDictionary
2头、IRequestContent数据、CancellationToken CancellationToken)上的(Docker.DotNet.ContainerOperations.CreateContainerAsync(CreateContainerParameters参数,CancellationToken CancellationToken)上的IEnumerable
1 errorHandlers、HttpMethod方法、字符串路径、IQueryString查询字符串、IRequestContent正文、IDictionary
2头、TimeSpan超时、CancellationToken标记)在/src/My.FunctionalTests/Helpers/Docker/DockerSetup.cs第34行中的My.FunctionalTests.Helpers.DockerSetup.StartContainerAsync(字符串图像、字符串标记、字符串主机端口、字符串容器端口、IList
1环境变量) 在/src/My.FunctionalTests/Helpers/docker/DockerSetupExtensions.cs中的My.FunctionalTests.Helpers.DockerSetupExtensions.startocalstackasync(DockerSetup-docker,String-services)中 在/src/My.FunctionalTests/MyTests.cs中的My.FunctionalTests.MyTests.GetAsync\u Valid\u Success(字符串url)中:第36行

在做了一些谷歌搜索之后,这可能是由
localhost
冲突引起的。我对这一点有点不了解,所以我想知道

  • 为什么这个错误会抛出
  • 我能做些什么来解决它
以下是相关代码:

Dockerfile

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /src

# Copy csproj and restore as distinct layers
COPY ./My.sln .
COPY ./My.API/My.API.csproj ./My.API/My.API.csproj
COPY ./My.FunctionalTests/My.FunctionalTests.csproj ./My.FunctionalTests/My.FunctionalTests.csproj
RUN dotnet restore

# Copy everything else and build
COPY . .
RUN dotnet publish -c Release -o /app

# Functional tests
FROM build as functionaltest
WORKDIR /src/My.FunctionalTests
RUN dotnet test
DockerSetup.cs

公共类DockerSetup
{
私有只读DockerClient\u DockerClient;
公共DockerSetup()
{
_dockerClient=新的dockerClient配置(新Uri(DockerClientConfiguration()).CreateClient();
}
私有静态字符串DockerApiUri()
{
var isWindows=RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
如果(iWindows)
{
返回“npipe://./pipe/docker_engine";
}
var isLinux=RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
var isMacOS=RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
if(isLinux | | isMacOS)
{
返回“unix:/var/run/docker.sock”;
}
抛出新异常(“无法确定运行此操作的操作系统,似乎不是Windows、MacOS或Linux!?”;
}
公共异步任务PullImageAsync(字符串图像、字符串标记)
{
等待_dockerClient.Images
.CreateImageAsync(新的ImagesCreateParameters
{
FromImage=image,
标签=标签
},
新建AuthConfig(),
新进展();
}
公共异步任务StartContainerAsync(字符串图像、字符串标记、字符串主机端口、字符串容器端口、IList环境变量)
{
var response=await\u dockerClient.Containers.createContainerSync(新的CreateContainerParameters
{
Image=$“{Image}:{tag}”,
ExposedPorts=新字典
{
{
containerPort,默认值(EmptyStruct)
}
},
HostConfig=newhostconfig
{
PortBindings=新字典
{
{containerPort,新列表{newportbinding{HostPort=HostPort}}
},
PublishAllPorts=false
},
Env=环境变量
});
wait\u dockerClient.Containers.StartContainerAsync(response.ID,null);
返回response.ID;
}
公共异步任务StopContainerAsync(字符串containerId)
{
if(containerId!=null)
{
wait_dockerClient.Containers.KillContainerAsync(containerId,new ContainerKillParameters());
}
}
}
然后我在测试中使用此代码,如下所示:

MyTests.cs

公共类MyTests
:IClassFixture
{
私人住宅