我最近开始学习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”。
我为asp.net核心this this和this尝试了不同的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"]
注意:我无法切换到Linux Container
,因为docker显示运行时错误,所以我正在使用Windows Container
并且IIS Server
在“打开窗口”功能中未启用。
我无法弄清楚我在做什么错?
任何人都可以指导我使用Windows容器中的api
来托管docker
的正确方法。
任何帮助都会很棒。
答案 0 :(得分:2)
看起来像生成的dockerfile形式vs没有引用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
测试
答案 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
答案 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
希望这会有所帮助。