如何在docker容器中托管asp.net核心wep api
我最近开始学习如何在docker容器中托管asp.net核心wep api,docker,asp.net-core,asp.net-core-webapi,Docker,Asp.net Core,Asp.net Core Webapi,我最近开始学习docker,但我在使用visualstudio code在dockerwindows容器中创建一个简单的asp.net核心web api锅炉板应用程序时遇到了问题 我已经在project中设置了Docker Fie,并运行了Docker build——标记helloapi。 但是当我运行docker run-p 9000:80 helloapi时,我得到以下错误: 找不到任何兼容的框架版本 指定的框架“Microsoft.AspNetCore.App”,版本“2.1.1”为 没有
docker
,但我在使用visualstudio code
在docker
windows容器中创建一个简单的asp.net核心web api
锅炉板应用程序时遇到了问题
我已经在project中设置了Docker Fie
,并运行了Docker build——标记helloapi。
但是当我运行docker run-p 9000:80 helloapi时,我得到以下错误:
找不到任何兼容的框架版本
指定的框架“Microsoft.AspNetCore.App”,版本“2.1.1”为
没有找到。
-检查应用程序依赖项并针对安装在以下位置的框架版本:
\
-或者,安装框架版本“2.1.1”
我试过很多教程和教程
我尝试了不同的docker图像用于asp.net核心和
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
FROM microsoft/aspnetcore
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-/publish} .
ENTRYPOINT ["dotnet", "HelloApi.dll"]
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>
注意:我无法切换到Linux容器
,因为docker显示了一些运行时错误,所以我使用的是Windows容器
,而且IIS服务器
没有依次启用Windows功能
我不知道我做错了什么
有人能告诉我在windows容器中使用docker
托管api
的正确方法吗
任何帮助都会很好。我已经使用Kestrel web server成功地在docker中托管了dotnet core 2.1 WebAPI应用程序,图像和标签分别为2.1-sdk和dotnet:2.1-aspnetcore-runtime,用于多阶段构建,例如
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
FROM microsoft/dotnet:2.1-sdk AS build
希望这有帮助。看起来像是生成的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-p8080:80——名称appcontainer1 app1
测试一下
浏览到看起来您所遵循的教程都是针对.NET Core 2.0的,但您的项目使用的是.NET Core 2.1
正如您(可能)所知,Dockerfile
中的第一行定义了在哪个映像上运行应用程序。在您的情况下,您可以使用microsoft/aspnetcore
。如果你看一看图片,你会看到上面写着:
2.1及更新版本的最新图像现已在microsoft/dotnet上提供。有关迁移到2.1的更多详细信息,请参见此
单击该链接,您将进入支持.NET Core 2.1的图像的Docker Hub页面
因此,正如另一个答案中所述,您需要更改Dockerfile
,以引用安装了.NET Core 2.1运行时的不同映像。
您可以将第一行更改为:
FROM microsoft/dotnet
这可能会使用安装了.NET Core 2.1 SDK的映像,但如果您计划将映像部署到生产环境中,则该映像将过于简单
目前的做法是使用多阶段DockerFile在容器内执行构建、测试和发布步骤。你可以看看这个。这允许您使用不同的映像库来构建和测试应用程序,但仅使用较小的运行时映像作为最终生产映像
请看一些示例,了解如何做到这一点
在查找教程时,请注意它们使用较新的.NET Core 2.1作为基础映像,或者确保您创建的任何应用程序使用与教程相同的.NET Core版本
希望有帮助
Dockerfile
docker-compose.yml
运行下面的命令
你能同时显示docker文件的内容吗?你先运行docker build吗?@SimplyGed,我已经更新了,谢谢。@MarcusHöglund,这很明显,我运行了它,我已经更新了问题中的信息。谢谢。我正在使用
windows容器
,你能分享你的工作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"]
version: '3.5'
services:
sample-web-api:
build: SampleWebApi/
restart: always
ports:
- "7000:80"
docker-compose build
docker-compose up