如何在docker容器内托管asp.net核心wep api

时间:2018-10-24 04:01:26

标签: docker asp.net-core asp.net-core-webapi

我最近开始学习docker,但是在asp.net core web api Windows容器中托管使用​​Visual Studio Code创建的简单docker样板应用程序时遇到了问题。

我已在项目中设置Docker Fie并运行docker build --tag helloapi .

但是当我运行docker run -p 9000:80 helloapi时,出现以下错误:

  

找不到任何兼容的框架版本   指定的框架'Microsoft.AspNetCore.App'版本'2.1.1'是   未找到。     -检查应用程序依赖性并确定安装在以下位置的框架版本:         \     -或者,安装框架版本“ 2.1.1”。

我尝试了许多教程this thisthis

我为asp.net核心this thisthis尝试了不同的docker镜像。

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来托管docker的正确方法。

任何帮助都会很棒。

4 个答案:

答案 0 :(得分:2)

看起来像生成的dockerfile形式vs没有引用dotnet:2.1-aspnetcore-runtimedotnet: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

答案 1 :(得分:1)

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

您(可能)知道,Dockerfile的第一行定义了在其上运行应用程序的图像。根据您的情况,您microsoft/aspnetcore。如果您查看Docker Hub page for the microsoft/aspnetcore图片,您会看到它说:

  

Microsoft / dotnet上提供了2.1及更高版本的最新图像。有关迁移到2.1的更多详细信息,请参见此link

单击该链接会将您带到microsoft/dotnet映像的Docker Hub页面,该映像支持.NET Core 2.1。

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

FROM microsoft/dotnet

可以使用已安装.NET Core 2.1 SDK的映像,但是如果您打算将该映像部署到生产环境,则该映像可能会显得过高。

当前的实践是使用多阶段Dockerfile在容器内部执行构建,测试和发布步骤。您可以阅读有关此here的信息。这样一来,您可以使用其他映像库来构建和测试应用程序,而仅将较小的运行时映像用作最终生产映像。

看看.NET Core Docker Samples中的一些内容,以了解如何执行此操作。

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

希望有帮助。

答案 2 :(得分:1)

Dockerfile

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
COPY ./SampleWebApi.csproj /SampleWebApi/
RUN dotnet restore ./SampleWebApi/SampleWebApi.csproj
COPY . ./SampleWebApi/
WORKDIR /SampleWebApi/
RUN dotnet build "SampleWebApi.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "SampleWebApi.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SampleWebApi.dll"]

docker-compose.yml

version: '3.5'

services:
    sample-web-api:
        build: SampleWebApi/
        restart: always
        ports:
            - "7000:80"

运行以下命令

docker-compose build
docker-compose up

Sample web API code along with Dockerfile on Github

答案 3 :(得分:0)

我已经成功地在Kestrel网络服务器上使用了microsoft/dotnet图像以及 2.1-sdk dotnet:2.1-aspnetcore的标签,在Docker中成功托管了dotnet core 2.1 WebAPI应用程序-runtime 分别用于多阶段构建,例如

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

希望这会有所帮助。