問題
今天(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,問題解決。