代码之家  ›  专栏  ›  技术社区  ›  Shaiju T

如何在Docker容器内托管ASP.NET核心WEP API

  •  2
  • Shaiju T  · 技术社区  · 7 年前

    我最近开始学习 docker 但是我在主持一个简单的 asp.net core web api 锅炉板应用程序创建使用 Visual Studio Code A内 码头工人 Windows容器。

    我已经准备好了 Docker Fie 在项目和运行中 docker build --tag helloapi .

    但当我跑步时 docker run -p 9000:80 helloapi 我得到以下错误:

    找不到任何兼容的框架版本 指定的框架“microsoft.aspnetcore.app”版本为“2.1.1” 找不到。 -检查应用程序依赖项并以安装在以下位置的框架版本为目标: \ -或者,安装框架版本“2.1.1”。

    我试过很多教程 this this this .

    我为ASP.NET核心尝试了不同的Docker映像 this this this .

    dotnet核心版本:

     dotnet --info
    
    .NET Core SDK (reflecting any global.json):
      Version:   2.1.402
    
    .NET Core SDKs installed:
      2.1.402 
    
    .NET Core runtimes installed:
      Microsoft.AspNetCore.All 2.1.4 
      Microsoft.AspNetCore.App 2.1.4 
      Microsoft.NETCore.App 2.1.4 
    

    helloapi.csproj文件

    <Project Sdk="Microsoft.NET.Sdk.Web">
    
      <PropertyGroup>
        <TargetFramework>netcoreapp2.1</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <Folder Include="wwwroot\" />
      </ItemGroup>
    
      <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.App" />
      </ItemGroup>
    
    </Project>
    

    Docker文件:

    FROM microsoft/aspnetcore
    ARG source
    WORKDIR /app
    EXPOSE 80
    COPY ${source:-/publish} .
    ENTRYPOINT ["dotnet", "HelloApi.dll"]
    

    enter image description here

    注: 我不能切换到 Linux Container 因为Docker显示了一些运行时错误,所以我使用 Windows Container 以及 IIS Server 未依次启用Windows功能。

    我不知道我在做什么?

    有人能给我指路吗 api 使用 码头工人 在Windows容器中。

    任何帮助都会很好。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Marcus Höglund    7 年前

    看起来生成的dockerfile表单没有引用 dotnet:2.1-aspnetcore-runtime dotnet:2.1-sdk .

    尝试以下步骤

    将下面的dockerfile添加到解决方案文件夹中

    FROM microsoft/dotnet:2.1-sdk AS build-env
    WORKDIR /build
    COPY . /build
    
    #Restore
    RUN dotnet restore ./HelloApi.sln
    
    RUN dotnet publish ./HelloApi/ -o /publish --configuration Release
    
    # Build runtime image
    FROM microsoft/dotnet:2.1-aspnetcore-runtime
    WORKDIR /app
    COPY --from=build-env /publish/ .
    ENTRYPOINT ["dotnet", "WebApp.dll"]
    

    建立它

    docker build -t app1 .

    运行它

    docker run -p 8080:80 --name appcontainer1 app1

    测试一下

    浏览到 http://localhost:8080

        2
  •  1
  •   Simply Ged Saeed    7 年前

    您所遵循的教程似乎都是针对.NET Core 2.0的,但您的项目使用的是.NET Core 2.1。

    正如你(可能)所知,第一行 Dockerfile 定义运行应用程序的映像。就你而言 microsoft/aspnetcore . 如果你看一下 Docker Hub page for the microsoft/aspnetcore 你看到的图片上写着:

    最新的2.1和更新版本的图像现在可以在Microsoft/DotNet上使用。看看这个 link 有关迁移到2.1的详细信息。

    点击该链接,进入Docker Hub页面 microsoft/dotnet 支持.NET核心2.1的映像。

    因此,如另一个答案所述,您需要更改 文档文件 引用安装了.NET Core 2.1运行时的其他映像。 您可以将第一行更改为:

    FROM microsoft/dotnet
    

    它可以使用安装了.NET Core 2.1 SDK的映像,但如果计划将该映像部署到生产环境中,则该映像会被破坏。

    当前的实践是使用多级dockerfiles在容器中执行构建、测试和发布步骤。你可以读到这个 here . 这允许您使用不同的映像库来构建和测试应用程序,但只对最终的生产映像使用较小的运行时映像。

    看一看 .NET Core Docker Samples 看看怎么做。

    请注意,当您在寻找使用更新的.NET Core 2.1作为基本映像的教程时,或者确保您使用与教程相同的.NET核心版本创建任何应用程序。

    希望有帮助。

        3
  •  0
  •   Ryan.Bartsch    7 年前

    我已经成功地在Docker中使用KestrelWeb服务器和 microsoft/dotnet 图像和标签 2.1-软件开发工具包 dotnet:2.1-aspnetcore-runtime 在多阶段构建中分别用于构建和运行时,例如

    FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
    FROM microsoft/dotnet:2.1-sdk AS build
    

    希望这有帮助。