最小Docker for ASP.NET Core

2uluyalo  于 5个月前  发布在  .NET
关注(0)|答案(1)|浏览(47)

我可以用ASP.NET Core构建一个简单的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`)


当我尝试根据本指南将其“dockerize”时,它不起作用:

# 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


我做错了什么?

已编辑

  • 我在macos上运行8.0时遇到问题,所以我将映像降级为7.0
  • 我现在可以从Docker内发送GET请求了
  • 但 * 不是 * 从外部(从我的本地机器)
$ 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 !

dm7nw8vv

dm7nw8vv1#

launchSettings.json仅适用于开发环境:
launchSettings.json文件:

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

并且提供的文章不会将其复制到Docker镜像。
如果你想在Docker镜像中摆弄它,那么你需要将相应的环境变量(DOTNET_ENVIRONMENT和/或ASPNETCORE_ENVIRONMENT,取决于框架版本)设置为Development
但一般来说,你不应该这样做,默认情况下,ASP.NET Core将侦听容器中的80(pre .NET 8)或8080(.NET 8)端口,因此只需使用并Map到它--p 8000:8080。如果你想使用容器中的另一个端口-将ASPNETCORE_URLS设置为所需值或为.NET 8 -ASPNETCORE_HTTP_PORTS
FROM之后的下一行添加WORKDIR /App-由于某种原因,dotnet命令挂在根文件夹中(或者至少工作时间太长),并在启动容器后等待一段时间。
但一般来说,建议遵循您浏览过的文档中的标准模式进行镜像构建。它使用多级构建,可以减少最终容器的大小,因为它只有运行时而没有SDK。
另请参阅:

相关问题