【问题标题】:How do I automatically start a .NET Core 3.1 API when the docker container starts?如何在 docker 容器启动时自动启动 .NET Core 3.1 API?
【发布时间】: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 来启动容器一样简单。这也适用于本地。

标签: docker .net-core


【解决方案1】:

从 Visual Studio 外部运行 docker-compose up --build 将重建并按预期运行容器。

【讨论】:

    【解决方案2】:

    端口 80 可能导致问题。端口 80 由 IIS 占用,并且在您运行容器时可能会导致问题。将其映射到其他端口。

    firstapi:
        environment:
          - ASPNETCORE_ENVIRONMENT=Development
        ports:
          - **"8000:80"**
        volumes:
          - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
    

    【讨论】:

    • 我不希望我的应用程序总是在 8000 上运行。它应该绑定到主机上的任何端口,因为它需要随着负载的增加而扩展。
    • 这在您不会运行 IIS 的云环境中应该不是问题。如果您想在本地将其作为 docker 容器运行,请停止 IIS 并在 80 上运行它或映射到不同的端口(如 8000)。
    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多