安装 VS2022 后 Docker 部署 ASPNETCore 6 项目报错解决方法
问题
今天(2921-11-09)VS2022 正式版发布了,我当然是闪现上去安装了最新版本。然后我用 VS2022 编译了我之前在 dotnet 6 rc2 的时候创建的 ASP.NET Core 6 的项目,用 docker 部署到服务器上,boom 了。下面是使用 docker logs
命令查看的日志:
It was not possible to find any compatible framework version
The framework 'Microsoft.NETCore.App', version '6.0.0' (x64) was not found.
- The following frameworks were found:
6.0.0-rc.2.21480.5 at [/usr/share/dotnet/shared/Microsoft.NETCore.App]
You can resolve the problem by installing the specified framework and/or SDK.
The specified framework can be found at:
- https://aka.ms/dotnet-core-applaunch?framework=Microsoft.NETCore.App&framework_version=6.0.0...........
可以很清楚的猜到,是 .NET 6 正式版发布前后,我的项目部署时使用的版本混乱造成的的小小问题。
本地环境
现在我电脑上是 VS2022 正式版和 Preview 版本并存。
同时,我的电脑上 .NET SDK 也有多个版本共存:
> dotnet --list-sdks
5.0.402 [C:\Program Files\dotnet\sdk]
6.0.100-rc.2.21505.57 [C:\Program Files\dotnet\sdk]
6.0.100 [C:\Program Files\dotnet\sdk]
可以看到,6.0.100 的正式版 SDK 已经被安装上了。
服务器环境
服务器上有前些日子 pull 下的 ASPNET 镜像,tag 是 6.0,也不知道是正式版还是 rc2 :
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/aspnet 6.0 980c8f80fc21 3 weeks ago 208MB
...
Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
EXPOSE 80
...
可以看到我的 Dockerfile 中指定的 aspnet 镜像的 tag 是 6.0。
查找问题
在服务器上使用 docker inspect
命令查看一下服务器上 mcr.microsoft.com/dotnet/aspnet:6.0
的镜像详情:
......
"Env": [
......
"DOTNET_VERSION=6.0.0-rc.2.21480.5",
"ASPNET_VERSION=6.0.0-rc.2.21480.10",
......
],
......
确定了虽然这个镜像的 tag 是 6.0,但他的 .NET 版本还是 .NET 6 RC2。
我这次编译是用的今天安装 VS2022 时,安装的正式版 .NET 6 SDK 编译的。所以我猜测 RC 2 的 环境无法运行正式版编译的项目。
解决方案
尝试在服务器上 pull 一下 latest 的镜像:
$ docker pull mcr.microsoft.com/dotnet/aspnet
使用 docker images
命令查看一下当前的镜像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/aspnet latest 2fc5b10637a6 19 hours ago 208MB
mcr.microsoft.com/dotnet/aspnet 6.0 980c8f80fc21 3 weeks ago 208MB
可以看到 pull 下了一个 tag 为 latest 的镜像,而且是 19 小时之前刚刚被创建。
然后修改项目的 Dockerfile 文件,将使用的 ASPNET 镜像的 tag 改成 latest:
FROM mcr.microsoft.com/dotnet/aspnet:latest
WORKDIR /app
EXPOSE 80
...
然后重新 build 重新 run,问题解决。