【问题标题】:Error message "Program does not contain a static 'Main' method suitable for an entry point"错误消息“程序不包含适用于入口点的静态 'Main' 方法”
【发布时间】:2019-02-21 09:15:01
【问题描述】:

我有一个 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. &lt;GenereteProgramFile&gt; false 没有帮助。

有人可以帮我解决这个可怕的问题吗?

【问题讨论】:

  • 你的项目结构是什么?分享给我们,你在哪里运行 docker 命令?对于这个错误,通常是文件夹中没有Program.cs
  • 了解更多细节会很好。您是否有公开的源文件可以重现该问题?您的 Main 方法位于哪个项目中?您是否尝试在 Docker 上下文之外重现该问题(例如,将您在 Dockerfile 中复制的文件夹集复制到计算机上的单独文件夹并尝试从该新位置构建)?
  • 我遇到了类似的问题。看看stackoverflow.com/questions/55816916/…也许会起作用

标签: docker asp.net-core


【解决方案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

...以及做一些清理工作。

一般来说,在我的开发机器上运行构建命令可以正常工作,但作为构建容器的一部分,它会失败。

【讨论】:

  • 请在此处添加链接中的相关部分。
  • 没有构建,因为 'RUN dotnet publish' 执行构建过程。您可以指定参数来启用或禁用。
  • CaseyK - 你能分享一下你的 Dockerfile 在它不工作时的样子,以及你为了让它工作做了哪些改变?正如 AlexZholob 所说,理论上应该不需要运行 build 命令,因为 publish 隐含地这样做了。
  • 谢谢你 - 我遇到了完全相同的问题,它似乎与设置 -o 值有关,如果你不指定它,那么 build 工作但如果你使用它然后它不是出于某种原因,但发布确实如此。
猜你喜欢
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
相关资源
最近更新 更多