我可以用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 !
型
1条答案
按热度按时间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。
另请参阅: