【发布时间】:2020-07-09 19:39:14
【问题描述】:
当我将 .NET Core WebAPI 部署到 Docker 容器时,默认情况下它无法“运行”。 (是dotnet不运行,实际容器按预期运行)
Running docker ps -a 显示状态为“UP”的容器:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eb3fa8be5101 firstapi:dev "tail -f /dev/null" 4 minutes ago Up 4 minutes 0.0.0.0:32790->80/tcp MyFirstApi
尝试点击“http://localhost:32790/api/WeatherForecast”会在浏览器中显示错误 (ERR_EMPTY_RESPONSE) 并在 Postman 中显示“错误:套接字挂起”。
当我在 Visual Studio 中调试这个项目时(调试项目设置为“Docker Compose”),我可以成功点击 API。
一旦我停止调试,我就无法再次到达端点。
当我进入容器并手动启动 API 时,它会再次在我的浏览器中运行:
PS C:\WINDOWS\system32> docker exec -it eb3 /bin/bash
root@eb3fa8be5101:/app# cd /app/bin/Debug/netcoreapp3.1/
root@eb3fa8be5101:/app/bin/Debug/netcoreapp3.1# dotnet FirstApi.dll
[18:43:16 INF] Starting up
[18:43:16 INF] Now listening on: http://[::]:80
[18:43:16 INF] Application started. Press Ctrl+C to shut down.
[18:43:16 INF] Hosting environment: Development
[18:43:16 INF] Content root path: /app/bin/Debug/netcoreapp3.1
我的 dockerfile 看起来很标准,从 VS 生成它时就没有改变:
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["/FirstApi.csproj", "FirstApi/"]
RUN dotnet restore "FirstApi/FirstApi.csproj"
COPY . .
WORKDIR "/src/FirstApi"
RUN dotnet build "FirstApi.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "FirstApi.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "FirstApi.dll"]
而且我的 launchSettings.json 文件也很标准:
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
"publishAllPorts": true,
"useSSL": false
}
}
}
docker-compose.yml 文件:
version: '3.4'
services:
firstapi:
image: ${DOCKER_REGISTRY-}firstapi
build:
context: .
dockerfile: FirstApi/Dockerfile
还有 docker-compose.override.yml:
version: '3.4'
services:
firstapi:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "80"
volumes:
- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
【问题讨论】:
-
所以,当您使用 Docker 配置从 VS 启动它时,调试工作正常,对吗?您的问题是,当您停止调试时,您无法再访问您的应用程序?如果是这样,这听起来像是正常行为。当您停止调试时,它会停止容器。我理解正确吗?
-
谢谢,这很有意义。一般来说,我对 docker 还是很陌生。我意识到,当应用程序要发布到生产环境中时,应该像运行:
docker-compose up --build来启动容器一样简单。这也适用于本地。