我可以使用ASP.NET核心构建一个简单的REST API端点:

$ rm -rf PPP && mkdir PPP && cd PPP # <--- make sure dir is empty
$ dotnet new web 1>/dev/null
$ dotnet run
Building...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5270
# ... omitted other info ...

当我发送http GET请求时,一切正常:

$ curl http://localhost:5270/
Hello World! # <--- good ! (the default response generate in `dotnet new web`)                                                                                                   

当我试着按照this guide来"停靠"它时,它不起作用:

# Dockerfile 
FROM mcr.microsoft.com/dotnet/sdk:8.0
RUN mkdir Properties
COPY Program.cs Program.cs
COPY PPP.csproj PPP.csproj
COPY appsettings.json appsettings.json
COPY appsettings.Development.json appsettings.Development.json
COPY Properties/launchSettings.json Properties/launchSettings.json
EXPOSE 5270
CMD ["dotnet", "run"]

下面是我如何构建和运行docker映像

$ docker build --tag host --file Dockerfile .
$ docker run -p 8000:5270 -d -t --name scfrontcs host

下面是我得到的错误:

$ curl http://localhost:8000/                 
curl: (52) Empty reply from server

我做错了什么?


EDIT

  • 我在我的MacOS上运行8.0遇到了困难,所以我把图像降到了7.0
  • 我现在可以从within号 docker 发送GET个请求
  • 但有not个来自外部(从我本地的机器)
$ cat Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:7.0
WORKDIR /App
COPY Program.cs Program.cs
COPY scfrontcs.csproj scfrontcs.csproj
COPY appsettings.json appsettings.json
EXPOSE 5000
# CMD ["dotnet", "run"] <--- commented, I will run it myself

$ docker build --tag host --file Dockerfile .
$ docker run -p 8000:5000 -d -t --name scfrontcs host
$ docker exec -it scfrontcs bash                     
root@fca567cab821:/App# dotnet run & # inside docker
[1] 97
root@fca567cab821:/App# info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5000
# ... omitted info ...
curl http://localhost:5000
Hello World # <--- works from within docker !

推荐答案

launchSettings.jsonis for development environments only:

启动Settings.json文件:

  • 仅在本地开发计算机上使用.
  • 未部署.
  • 包含配置文件设置.

并且所提供的文章不会将其复制到停靠站图像.

如果作为PoC,您想要在docker图像中摆弄它,那么您需要将corresponding environment变量(DOTNET_ENVIRONMENT和/或ASPNETCORE_ENVIRONMENT,取决于框架版本)设置为Development.

但总的来说,您不应该这样做,默认情况下,ASP.NET Core将侦听容器中的80(.NET8之前)或8080(.NET8)端口,所以只需使用并映射到它--p 8000:8080即可.如果您想使用容器内的另一个端口--将ASPNETCORE_URLS设置为所需的值或用于.NET8-ASPNETCORE_HTTP_PORTS.

FROM之后的下一行添加WORKDIR /App-由于某种原因,DotNet命令在根文件夹中挂起(或至少工作太长时间),并在启动容器后等待一段时间.

但一般来说,建议遵循您浏览的文档中的标准模式进行图像构建.它使用多级构建,这允许减少最终容器的大小,因为它将只有运行时而没有SDK.

另见:

Csharp相关问答推荐

为什么使用DXGI输出复制和Direct 3D时捕获的图像数据全为零?

Regex在c#中完全匹配

Unity如何在PlayerPrefs中保存数据?

SignalR客户端不会打印队列位置'

使用LayoutKind在C#中嵌套 struct .显式

不仅仅是一个简单的自定义按钮

S能够用DATETIME来计算,这有什么错呢?

MongoDB.NET-将数据绑定到模型类,但无法读取整数值

从ASP.NET Core中的枚举字段填充 Select 选项时,将默认的第一个选项添加为 Select 元素

TeamsBot SendActivityActivityTypes与ActivityTypes同步.键入不再起作用

如何在VS代码中为C#DotNet配置.json选项以调试内部终端的控制台应用程序

如何管理Azure认证客户端响应和证书 fingerprint

如何在onNext之前等待订阅者完成?

将FileStream的特定部分作为字节数组读取

如何使用EPPlus C#在单个单元格中可视化显示多行文字

c#在后台实现类型化数组

Maui:更改代码中的绑定字符串不会更新UI,除非重新生成字符串(MVVM)

.NET文档对继承的困惑

如何在.NET8中使用Blazor Web App(WebAssembly)托管服务器端控制器?

Windows 10上埃及标准时间的时区偏移不正确