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
C# Visual studio docker工具在调试时发布端口_C#_Docker_Asp.net Core_Dockerfile_Visual Studio 2019 - Fatal编程技术网

C# Visual studio docker工具在调试时发布端口

C# Visual studio docker工具在调试时发布端口,c#,docker,asp.net-core,dockerfile,visual-studio-2019,C#,Docker,Asp.net Core,Dockerfile,Visual Studio 2019,我刚刚开始使用Docker,已经安装了Docker for windows。 docker的基本设置是正确的,我已经能够调试一个简单的Asp.Net核心应用程序,该应用程序从Visual studio内部部署到容器中(使用针对docker的标准“Run”命令) 我遇到的问题是,在不使用localhost(即使用容器的IP)的情况下,能够从容器中访问托管的端点。我需要这个,因为我打算从xamarin应用程序中访问端点 在阅读了一些内容之后,我似乎需要“发布”应用程序正在运行的端口,在本例中是端口5

我刚刚开始使用Docker,已经安装了Docker for windows。
docker的基本设置是正确的,我已经能够调试一个简单的Asp.Net核心应用程序,该应用程序从Visual studio内部部署到容器中(使用针对docker的标准“Run”命令)

我遇到的问题是,在不使用localhost(即使用容器的IP)的情况下,能够从容器中访问托管的端点。我需要这个,因为我打算从xamarin应用程序中访问端点

在阅读了一些内容之后,我似乎需要“发布”应用程序正在运行的端口,在本例中是端口5000,但我似乎找不到在哪里配置VisualStudio来执行此操作

使用邮递员或web浏览器点击端点会导致相同的响应空\u响应错误

我希望有人能给我指出正确的方向

我的Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 5000
ENV ASPNETCORE_URLS http://<container ip>:5000

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY ["ItemCheckout/ItemCheckout.csproj", "ItemCheckout/"]
RUN dotnet restore "ItemCheckout/ItemCheckout.csproj"
COPY . .
WORKDIR "/src/ItemCheckout"
RUN dotnet build "ItemCheckout.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "ItemCheckout.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "ItemCheckout.dll"]
来自mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim作为基础
WORKDIR/app
曝光5000
ENV ASPNETCORE_URL http://:5000
来自mcr.microsoft.com/dotnet/core/sdk:2.2-stretch-AS-build
WORKDIR/src
复制[“ItemCheckout/ItemCheckout.csproj”,“ItemCheckout/”]
运行dotnet还原“ItemCheckout/ItemCheckout.csproj”
复制
WORKDIR“/src/ItemCheckout”
运行dotnet构建“ItemCheckout.csproj”-c发行版-o/app
从生成为发布
运行dotnet发布“ItemCheckout.csproj”-c Release-o/app
以垒为终场
WORKDIR/app
复制--from=publish/app。
入口点[“dotnet”,“ItemCheckout.dll”]
Startup.cs:

公共类启动
{
私有静态只读LoggerFactory _LoggerFactory=new LoggerFactory(new[]{new DebuggerProvider()});
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
services.AddMvc();
services.AddDbContext(o=>
{
o、 使用SQLServer(Configuration.GetConnectionString(“DefaultConnection”);
o、 使用loggerFactory(_loggerFactory);
});
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
}
program.cs:

公共类程序
{
公共静态异步任务主(字符串[]args)
{
等待CreateWebHostBuilder(args).Build().RunAsync();
}
公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseKestrel()
.useURL(“http://:5000”)
.UseStartup();
}
运行时的输出:

托管环境:开发
内容根路径:/app
正在收听:http://
:5000
应用程序已启动。按Ctrl+C组合键关闭


编辑:根据@MindSwipe的建议更新了program.cs,但是我仍然得到了相同的结果

好的-据我所见-您将容器上的端口与主机上的端口混淆了。 Docker中有两个端到端口的映射—主机端和客户端/容器端

有几种方法可以解决您无法连接的问题

容器运行时(F5调试,命令行)-执行以下命令: “docker ps-a” 您将看到正在运行的容器列表;有一个叫做“端口”的专栏。找到您容器的条目-可能是solutionname:dev。查看ports列,您将看到AA->BB

AA是您在浏览器中所需的端口-即主机端口-因此http://localhost:AA或http://IP-Address:AA/

BB是容器上的侦听端口-在您的示例中为5000

这有用吗

编辑: 更改此行:ENV ASPNETCORE_url http://:5000 到ENV ASPNETCORE_URL http://+:5000


这是相对于容器的,而不是相对于主机的。

是否确保ASP.NET Core应用程序正在端口500上运行?你也可以发布你的
Porgram.cs
吗?@MindSwipe补充道-但是从我使用ENV ASPNETCORE\u URL阅读的内容来看。。。dockerfile中的行告诉asp.net core要使用的端口,不是吗?我从来没有听说过,我总是使用
webBuilder.useURL(“…”,“…”)。也可以尝试实际使用IP而不是
http://+:5000
http://:5000
更改为
http://localhost:5000
,首先确保您能够从邮递员或web浏览器访问核心应用程序。