Docker 无法执行,因为找不到应用程序或未安装兼容的 .NET SDK

Posted

技术标签:

【中文标题】Docker 无法执行,因为找不到应用程序或未安装兼容的 .NET SDK【英文标题】:Docker Could not execute because the application was not found or a compatible .NET SDK is not installed 【发布时间】:2021-11-01 06:42:36 【问题描述】:

我正在尝试部署 .NET 5 控制台应用程序后台服务以在 Linux Azure VM 上的 Docker Linux 容器中运行。最终结果是容器立即退出,log显示:

无法执行,因为找不到应用程序或 未安装兼容的 .NET SDK。造成这种情况的可能原因 包括: * 您打算执行一个 .NET 程序: 应用程序“FileProcessSvcPOC.dll”不存在。 * 您打算执行 .NET SDK 命令: 找不到任何已安装的 .NET SDK。

我遵循的过程是使用带有远程上下文的 docker compose 到 VM。我还尝试将容器推送到 Azure 存储库并以这种方式部署(不使用 compose)并得到相同的错误。

Docker 构建输出(未显示错误):

=> [内部] 从 Dockerfile 加载构建定义 0.2s => => 传输 dockerfile:778B 0.1s => [内部] 加载 .dockerignore 0.1s => => 传输上下文:35B 0.1s => [内部] 加载 mcr.microsoft.com/dotnet/sdk 的元数据: 5.0 0.1s => [内部] 为 mcr.microsoft.com/dotnet/runtime:5.0 加载元数据 0.2s => [build 1/7] FROM mcr.microsoft.com/dotnet/sdk:5.0@sha256:081a6c31153f16c02eeb7f1ad663adb8e1d21fa0d59402348c13bba7659a5419 0.0s => [base 1/2] FROM mcr.microsoft.com/dotnet/runtime:5.0@sha256:d78f83397086556adecb7d5b9e86751b9b591ffc7c17addaa55109b733cd0f50 0.0s => [内部] 加载构建上下文 0.1s => => 传输上下文:863B 0.1s => CACHED [base 2/2] WORKDIR /app 0.0s => CACHED [final 1/2] WORKDIR /app 0.0s => 缓存 [内部版本 2/7] WORKDIR /src 0.0s => 缓存 [内部版本 3/7] 复制 [FileProcessSvcPOC/FileProcessSvcPOC.csproj, FileProcessSvcPOC/] 0.0s => 缓存 [build 4/7] 运行 dotnet restore "FileProcessSvcPOC/FileProcessSvcPOC.csproj" 0.0s => 缓存 [build 5/7] 复制。 . 0.0s => CACHED [build 6/7] WORKDIR /src/FileProcessSvcPOC 0.0s => CACHED [build 7/7] RUN dotnet build "FileProcessSvcPOC.csproj" -c Release -o /app/build 0.0s => 缓存 [发布 1/1] 运行 dotnet publish "FileProcessSvcPOC.csproj" -c Release -o /app/publish 0.0s => 缓存 [最终 2/2] 复制 --from=publish /app/publish 。 0.0s => 导出到图像 0.1s => => 导出层 0.0s => => 写入图像 sha256:04297f1fb6c30fefb6e39005404b868bb8fd740a30de2174ea42780e16120ca7 0.0s => => 命名为 docker.io/library/fileprocesssvcpoc

Dockerfile:

FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["FileProcessSvcPOC/FileProcessSvcPOC.csproj", "FileProcessSvcPOC/"]
RUN dotnet restore "FileProcessSvcPOC/FileProcessSvcPOC.csproj"
COPY . .
WORKDIR "/src/FileProcessSvcPOC"
RUN dotnet build "FileProcessSvcPOC.csproj" -c Release -o /app/build

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

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

docker-compose.yml:

version: '3.4'

services:
  fileprocesssvcpoc:
    image: $DOCKER_REGISTRY-fileprocesssvcpoc
    build:
      context: .
      dockerfile: FileProcessSvcPOC/Dockerfile

控制台应用 Program.cs CreateHostBuilder

    public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
        .UseSystemd()
                .ConfigureServices((hostContext, services) =>
                
                    services.AddHostedService<FileListenerSvc>();
                    services.Configure<AppSettings>(hostContext.Configuration.GetSection("AppSettings"));
                );

*我读到的关于在 Linux 上部署 .NET 后台服务的文章说要使用 UseSystemd()。

我已经使用 Docker 上下文 / compose 将 .NET 5 Web 应用程序部署到同一个 Linux VM,它运行良好。

知道为什么上面为控制台应用程序设置的错误提示在 DockerFile 中引用并显示在构建输出中时未安装 .NET SDK 吗?

【问题讨论】:

最可能的原因是被引用的 DLL 文件不存在。尝试在容器上运行命令以输出 DLL 应该存在的目录内容:docker run --rm --entrypoint /bin/bash &lt;app-tag&gt; -c ls。请注意,Linux 文件系统区分大小写。 @MattThalman 谢谢,我专注于 SDK。我会试试这个。 【参考方案1】:

Matt Thalman 在对我的问题发表评论时提供的命令显示,该应用程序正在作为没有 dll 的 .exe 发布到容器中。

更改发布选项以生成 dll 解决了问题。

【讨论】:

以上是关于Docker 无法执行,因为找不到应用程序或未安装兼容的 .NET SDK的主要内容,如果未能解决你的问题,请参考以下文章

代码执行无法继续,因为找不到 MSVCP100D.dll [重复]

错误:在 Docker 中的 Alpine 上安装 psycopg2 时找不到 pg_config 可执行文件

docker安装,err:exit status 255,提示找不到虚拟机IP

运行java文件显示找不到或无法加载主类怎么解决?

VS2015报错:由于找不到opencv_wordxxx.dll,无法继续执行代码。重新安装程序可能会解决此问题。

VS2015报错:由于找不到opencv_wordxxx.dll,无法继续执行代码。重新安装程序可能会解决此问题。