![](/img/trans.png)
[英]Cannot run Asp.Net core web api scaffolded application in docker?
[英]Cannot test a simple Asp.net core web api deployed to Docker
我是 Docker 的新手,真的很想体验它的功能。 在这里,我想在 Docker 中运行一个简单的 Asp.net core web api(使用docker run
),而不是使用 IIS 运行它。
这很简单,因为它正是默认的自动生成 ASP.NET 核心 Web API 项目,只有一个名为ValuesController
控制器。 通常在使用 IISExpress 进行调试时,以下 URI 应响应一组值:
http://localhost:[some_port]/api/values
现在我为项目添加 Docker 支持(使用 Windows 容器)。 构建 Docker 镜像后,可以使用docker images
列出它。 现在我运行 Docker 镜像来托管我的 web api,如下所示:
docker run -t -rm -p 80:50633 hellodocker:dev
它运行正常,我可以使用docker ps
检查。 但是为了测试它是否真的有效,我尝试在浏览器中输入以下地址:
http://localhost/api/values
它不起作用,没有显示任何内容,它看起来就像一个不存在的站点。
当我尝试以下命令docker exec [container_id] netstat
,它有时会显示状态为TIME_WAIT
的记录,并且几乎没有任何时间。 虽然我不确定这是否与外部聆听有关。
这是 Dockerfile 的内容:
FROM microsoft/dotnet:2.2-aspnetcore-runtime-nanoserver-1803 AS base
WORKDIR /app
EXPOSE 50633
EXPOSE 44322
FROM microsoft/dotnet:2.2-sdk-nanoserver-1803 AS build
WORKDIR /src
COPY HelloDocker/HelloDocker.csproj HelloDocker/
RUN dotnet restore HelloDocker/HelloDocker.csproj
COPY . .
WORKDIR /src/HelloDocker
RUN dotnet build HelloDocker.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish HelloDocker.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "HelloDocker.dll"]
我真的被困在这一点上。 一个 hello-world 应用程序可能只打印出一个简单的字符串,但这个hellodocker
应该托管在hellodocker
中,并像我们在 IIS 中托管它一样处理任何 HTTP 请求。
在尝试删除构建的映像并重建另一个映像后,使用上述相同的docker run
命令运行后,它看起来有所不同:
Hosting environment: Production
Content root path: C:\app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.
和以前一样,没有显示任何内容,提示根路径变为C:\\app
。 所以这一次看起来更明显的是它正在侦听请求。 但是,它仍然无法正常工作。
在您的 ENTRYPOINT 语句之前,尝试添加
ENV ASPNETCORE_URLS=http://+:50633 DOTNET_RUNNING_IN_CONTAINER=true
所以它看起来像这样:
FROM base AS final WORKDIR /app COPY --from=publish /app . ENV ASPNETCORE_URLS=http://+:50633 DOTNET_RUNNING_IN_CONTAINER=true ENTRYPOINT ["dotnet", "HelloDocker.dll"]
这有帮助吗?
我不知道为什么我无法从 Docker 的论坛中搜索解决方案,但是在尝试搜索Now listening on: http://[::]:80
,它让我找到了一个非常相似的链接Docker 论坛中的问题。
所以我在那里尝试了一种解决方案,首先使用docker inspect [container_id]
来查找容器的 IP 并使用该 IP 成功访问 Web API :)
容器的 IP 可以在Networks
部分找到:
"Networks": {
"nat": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "e336becc4500435f7338ebd8f84fef47ec2fc247f77bc82b6dbf49553f68afd5",
"EndpointID": "a8ede68e3f4bb02392c295901f65d50f0ee014c114f564768d9c82a4644b0218",
"Gateway": "172.30.240.1",
"IPAddress": "172.30.242.85",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "00:15:5d:5a:29:8d",
"DriverOpts": null
}
}
我现在用来测试web api的正确地址是:
http://172.30.242.85/api/values
更新:
我假设EXPOSE 50633
意味着EXPOSE 50633
将通过端口50633
公开 web api,所以我运行命令docker run -t -p 80:50633 hellodocker:dev
。
但实际上它在这里公开的端口仍然是默认的80
(不知道为什么)。 但至少这是有道理的。 因此,为了映射 docker 和主机之间的端口,我们使用命令docker run -t -p:80:80 hellodocker:dev
代替。 我已经试过了,它非常适合http://localhost/api/values
。
我认为在docker run -t -p:80:50633 hellodocker:dev
之前使用的命令docker run -t -p:80:50633 hellodocker:dev
用的端口映射(至少对于从主机测试 web api),因为http://172.30.242.85/api/values
应该如果 docker 实际运行 web api 以侦听默认端口80
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.