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 <app-tag> -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