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

Posted

技术标签:

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

我使用 ASP.NET Core 5 创建了一个基本的 Rest API,我想通过 docker 运行。该应用程序在 IIS Express 上运行良好。

https://docs.microsoft.com/fr-fr/aspnet/core/tutorials/first-web-api?view=aspnetcore-5.0&tabs=visual-studio

我还想创建一个 docker 容器来启动应用程序。

在项目文件夹中,我创建了一个包含多个文件的 Docker 文件夹。 这是我的 App.dockerfile:

FROM mcr.microsoft.com/dotnet/aspnet:5.0

ARG WEBAPP_VERSION=0.0.1
LABEL maintainer=anymail@email_server.com \
    Name=webapp \
    Version=$WEBAPP_VERSION
ARG URL_PORT
WORKDIR /app
ENV NUGET_XMLDOC_MODE skip
ENV ASPNETCORE_URLS http://*:$URL_PORT
ENTRYPOINT [ "dotnet", "WebApplication.dll" ]

我还有一个 Build.docker 文件:

FROM mcr.microsoft.com/dotnet/aspnet:5.0
## Can be Debug or Release.
ARG BUILD_CONFIG=Debug
ARG BUILDER_VERSION=0.0.1
LABEL maintainer=some_email@email_server.com \
    Name=webapp-build-$BUILD_CONFIG \
    Version=$BUILDER_VERSION
## Will be the path mapped to the external volume.
ARG BUILD_LOCATION=/app/out
ENV NUGET_XMLDOC_MODE skip
WORKDIR /app
COPY *.csproj .
RUN dotnet restore
COPY . /app
RUN dotnet publish --output $BUILD_LOCATION --configuration $BUILD_CONFIG

我终于有了一个 docker-compose.yml

version: '3'
services:
  webapp:
    container_name: webapp.test
    image: webapp:$WEBAPP_VERSION
    build:
      context: ../
      dockerfile: ./Docker/App.dockerfile
      args:
        WEBAPP_VERSION: $WEBAPP_VERSION
        URL_PORT: $URL_PORT
    ports:
      - "5000:$URL_PORT"
    volumes:
      - appbuild:/app
    links:
      - mysql
    environment:
      MYSQL_SERVER_NAME: $MYSQL_SERVER_NAME
    env_file:
      - secrets.env
    depends_on:
      - builder
  
  builder:
    container_name: builder
    image: webapp:$BUILDER_VERSION.$BUILD_CONFIG
    build:
      context: ../
      dockerfile: ./Docker/Build.dockerfile
      args:
        BUILDER_VERSION: $BUILDER_VERSION
        BUILD_CONFIG: $BUILD_CONFIG
        BUILD_LOCATION: $BUILD_LOCATION
    volumes:
      - appbuild:$BUILD_LOCATION
   
  mysql:
    container_name: $MYSQL_SERVER_NAME
    image: mysql/mysql-server:8.0.23
    restart: always
    volumes:
      - dbvol:/var/lib/mysql
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: root
    env_file:
      - secrets.env

volumes:
  appbuild:
  dbvol:

最后,我启动以下命令行:

docker build -f Docker/App.dockerfile -t webapp:Debug --build-arg URL_PORT=7909 .

这个过程相当快。 我也启动了这个命令行:

docker run --name webapp.test -p 5000:7909 -it webapp:Debug

我不幸收到一条错误消息。

Could not execute because the application was not found or a compatible .NET SDK is not installed.
Possible reasons for this include:
  * You intended to execute a .NET program:
      The application 'WebApplication.dll' does not exist.
  * You intended to execute a .NET SDK command:
      It was not possible to find any installed .NET SDKs.
      Install a .NET SDK from:
        https://aka.ms/dotnet-download

【问题讨论】:

您的dockerfile 中没有buildpublish 步骤。什么是 Build.docker? App.Dockerfile 没有构建任何东西,请尝试使用 Build.Dockerfile 构建。 build too ... 我有同样的错误消息 由于找不到应用程序或未安装兼容的 .NET SDK 无法执行。并且应用程序“还原”不存在。 在我的例子中,我在 ENTRYPOINT 的 dll 名称中有错字。 【参考方案1】:

您的构建 Dockerfile 使用 ASP.NET Core 运行时容器映像:

FROM mcr.microsoft.com/dotnet/aspnet:5.0

此容器没有 SDK,只有运行时。当你构建它时,它会失败:

RUN dotnet restore
Could not execute because the application was not found or a compatible .NET SDK is not installed. and The application 'restore' does not exist

因为dotnet restore 命令是一个SDK 命令。如果您只是使用运行时,则它不可用。

您应该为您的构建 Dockerfile 使用 SDK 容器(不是您的运行时 Dockerfile,这很好):

FROM mcr.microsoft.com/dotnet/sdk:5.0

【讨论】:

【参考方案2】:

如果你已经安装了 SDK 并且你有 x64 机器;

System Variables中删除以下项目> Path

C:\Program Files (x86)\dotnet

【讨论】:

【参考方案3】:

尝试在 .NET 6 的 VS Code 中配置 Docker 容器调试时出现相同的消息。几个问题:

    在 VS Code 的 tasks.json 中,默认的 "target": "base" 对我不起作用,因为我在 Dockerfile 中使用了阶段 build。所以我把它注释掉了......但是Docker extension needs it 注入了调试元数据。 更改为 "target": "build" 修复了错误。

    我跳过了 EXPOSE 和 ENV 部分,因为它通过 docker compose 或在 cmd 中手动转发端口时工作。应该在基础/构建阶段的开始:

    FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine as build
    WORKDIR /source
    EXPOSE 80                         #was missing
    ENV ASPNETCORE_URLS=http://+:80   #was missing
    

【讨论】:

【参考方案4】:

在我的例子中,dot net SDK 安装在不同的位置。一个简单的 where.exe dotnet 在 powershell 上返回以下内容

系统环境变量中有 2 个条目,即带有 x86 的条目在上面,所以它优先,所以我交换了它们并欢呼它开始工作。 特别感谢 https://www.hanselman.com/blog/dotnet-could-not-execute-because-the-application-was-not-found-or-a-compatible-net-sdk-is-not-installed

【讨论】:

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

浏览网页:出现错误,无法设置属性“value”的值:对象为null或未定义

UIPrintInteractionController - 未找到支持文档格式的属性或未找到支持的格式

无法设置对象 - 只读属性或未找到设置器

如何在 jquery 数据表中找到空表或未找到匹配项时添加自定义警告消息

例外:CocoaPods 未安装或未处于有效状态

Qt Designer 启动时出错:代码执行无法继续,因为未找到 MSVCP140_1.dll