错误信息:"程序不包含适用于入口点的静态'Main'方法"

3

我的ASP.NET CORE应用程序中包含几个项目,以下是Dockerfile:

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY src/Mbv.Vans.Core/Mbv.Vans.Core.csproj Mbv.Vans.Core/
COPY src/Mbv.Vans.Common/Mbv.Vans.Common.csproj Mbv.Vans.Common/
COPY src/Mbv.Vans.Api/Mbv.Vans.Api.csproj Mbv.Vans.Api/

RUN dotnet restore Mbv.Vans.Api/Mbv.Vans.Api.csproj
COPY . .
FROM build AS publish
RUN dotnet publish Mbv.Vans.Api/Mbv.Vans.Api.csproj --no-restore -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .

ENTRYPOINT ["dotnet", "Mbv.Vans.Api.dll"]

在线上运行RUN dotnet publish Mbv.Vans.Api/Mbv.Vans.Api.csproj --no-restore -c Release -o /app 时,构建项目失败并出现以下错误:

"程序不包含适用于入口点的静态'Main'方法"

这是我的 .csproj 文件:

<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
     <TargetFramework>netcoreapp2.2</TargetFramework>
     <GenerateDocumentationFile>true</GenerateDocumentationFile>
     <NoWarn>1591</NoWarn>
     <GenerateProgramFile>false</GenerateProgramFile>
</PropertyGroup>

我查了很多关于这个问题的问题,并将其分为以下解决方案:

  1. COPY . . 不能解决此问题
  2. 我只有一个 static void main
  3. <GenereteProgramFile> false 也无法解决。

有人能帮我打败这个可怕的问题吗?


你的项目结构是什么? 向我们展示一下,并告诉我们你在哪里运行了docker命令?对于这个错误,通常是由于文件夹中没有Program.cs引起的。 - Edward
能否提供更多细节信息呢?您是否有公开可用的源文件可以重现此问题?您的Main方法所在的项目是什么?您是否尝试在Docker环境之外复制正在复制的一组文件(例如,将您的Dockerfile中要复制的文件夹集合复制到计算机上的另一个文件夹中,并尝试从该新位置构建)以重现此问题? - Matt Thalman
我曾经遇到过类似的问题。看一下这个链接 https://stackoverflow.com/questions/55816916/could-not-find-xxx-program-specified-for-main-method-when-building-dotnet-app/55851522#55851522 或许可以解决你的问题。 - Shak Ham
1个回答

1

所以,我遇到了同样的问题,让我疯狂。这里的解决方案是跳过构建,直接发布。

我通过查看这个特定的示例得到帮助:https://github.com/dotnet/dotnet-docker/blob/master/samples/aspnetapp/Dockerfile.alpine-x64

正如你在其中看到的那样,没有进行构建。有一个还原,然后是发布。为什么不构建?我不知道。我正在调查,但至少对我来说它起作用了。让我知道它的效果如何。

编辑附加信息:

这是原始的不起作用的Dockerfile:

FROM microsoft/dotnet:2.2-aspnetcore-runtime-nanoserver-1809 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM microsoft/dotnet:2.2-sdk-nanoserver-1809 AS build
WORKDIR /src
COPY ["mercurynorth_netcore/mercurynorth_netcore.csproj", "mercurynorth_netcore/"]
RUN dotnet restore "mercurynorth_netcore/mercurynorth_netcore.csproj"
COPY . .
WORKDIR "/src/mercurynorth_netcore"
RUN dotnet build "mercurynorth_netcore.csproj" -c Release -o /app

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

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

...这是新工作的Dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-alpine AS build
WORKDIR /app


# Lets do a restore of the NuGet packages, and then restore the app in a container.
COPY mercurynorth_netcore.csproj ./
RUN dotnet restore "mercurynorth_netcore.csproj"
COPY . .
RUN dotnet publish "mercurynorth_netcore.csproj" -c Release -o /app

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS final
WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY --from=build /app .
ENTRYPOINT ["dotnet", "mercurynorth_netcore.dll"]

正如您所看到的,我通常所做的是删除这行代码:

RUN dotnet build "mercurynorth_netcore.csproj" -c Release -o /app

我需要在开发机上运行构建命令并进行一些清理工作。总的来说,这意味着在我的开发机上运行构建命令将运行良好,但在构建容器的过程中会失败。


1
请在此处添加您链接中的相关部分。 - JJJ
没有构建,因为“RUN dotnet publish”会进行构建过程。您可以指定参数以启用或禁用。 - AlexZholob
CaseyK - 你能分享一下当 Dockerfile 没有工作时它是什么样子的,以及你做了哪些更改使其工作吗?正如 AlexZholob 所说,理论上运行构建命令应该是不必要的,因为发布隐式地执行了这个操作。 - Matt Thalman
谢谢你 - 我也遇到了完全相同的问题,似乎与设置“-o”值有关,如果不指定它,则“build”可以工作,但如果使用它,则由于某种原因它不起作用,但“publish”可以。 - Scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接