当前位置: 首页 > 知识库问答 >
问题:

在使用docker构建时获取“程序不包含适合入口点的静态‘Main’方法”,为什么?

拓拔谭三
2023-03-14

我在使用Docker时遇到了一个问题,无法找到合适的解决方案。

我试图使用. NETSDK2.1构建Docker映像。

问题是,当Docker试图运行build语句时,它失败了,错误输出被忽略

CSC:错误CS5001:程序不包含适合入口点的静态“Main”方法

有趣的是,如果我在本地命令行上执行构建语句,它会很好地工作。

我已经在项目上检查了我的语言版本标签,它是7.3。

这是我的Docker文件

FROM microsoft/dotnet:2.1-sdk AS builder  
WORKDIR /src
COPY ./nuget  ./nuget
COPY ./NuGet.Config ./
COPY Services/AadTracking ./

# Copy all the referenced projects

COPY ./Services/AadTracking/Company/Company.Service.AadTracking/Company.Service.AadTracking.csproj ./AadTracking/Company/Company.Service.AadTracking/Company.Service.AadTracking.csproj
COPY ./Services/AadTracking/Office.Re.Service.AadTracking/Office.Re.Service.AadTracking.csproj ./AadTracking/Office.Re.Service.AadTracking/Office.Re.Service.AadTracking.csproj
COPY ./Services/AadTracking/Company/Office.Re.Service.AadTracking.Company/Office.Re.Service.AadTracking.Company.csproj ./AadTracking/Company/Office.Re.Service.AadTracking.Company/Office.Re.Service.AadTracking.Company.csproj
COPY ./Services/AadTracking/Office.Re.Service.AadTracking.EventStore/Office.Re.Service.AadTracking.EventStore.csproj ./AadTracking/Office.Re.Service.AadTracking.EventStore/Office.Re.Service.AadTracking.EventStore.csproj

# Restore packages
RUN dotnet restore "./AadTracking/Company/Company.Service.AadTracking/Company.Service.AadTracking.csproj"

RUN dotnet build -c Debug --no-restore "./AadTracking/Company/Company.Service.AadTracking/Company.Service.AadTracking.csproj"

# COPY source code 
#aad tracking
COPY ./Services/AadTracking/Company/Company.Service.AadTracking ./AadTracking/Company/Company.Service.AadTracking/
COPY ./Services/AadTracking/Office.Re.Service.AadTracking ./AadTracking/Office.Re.Service.AadTracking/
COPY ./Services/AadTracking/Company/Office.Re.Service.AadTracking.Company ./AadTracking/Company/Office.Re.Service.AadTracking.Company/
COPY ./Services/AadTracking/Office.Re.Service.AadTracking.EventStore ./AadTracking/Office.Re.Service.AadTracking.EventStore/

# Publish
RUN dotnet publish "./AadTracking/Company/Company.Service.AadTracking/Company.Service.AadTracking.csproj" -c Debug -o "../../dist"

# #Build the app image
FROM microsoft/dotnet:2.1-aspnetcore-runtime  
WORKDIR /app  

ENV ASPNETCORE_ENVIRONMENT Switch
ENV REINSURANCE_INSTANCE Docker-dev 

COPY --from=builder /dist .  

ENTRYPOINT ["dotnet", "Company.Service.AadTracking.dll"]

谢谢你的帮助!

共有3个答案

东郭和光
2023-03-14

在docker内部编译和发布应用程序需要在docker内部复制整个应用程序。这意味着您需要在docker中复制所有类文件(.cs)以及所需的支持文件(可能是resx或配置文件)。

请参阅以下参考资料

https://github.com/aspnet/aspnet-docker/issues/401

施利
2023-03-14

我也有同样的问题。
我已经意识到我的Docker文件与. csproj文件处于同一级别。我已经将我的Docker文件在我的文件夹结构中向上移动了一层,它构建得很好。

殷学
2023-03-14

我知道现在回答这个问题有点晚了。不过,VS 2019也存在同样的问题。NET核心3.1。我看了一眼微软提供的例子。原来Docker文件位于解决方案中的其他位置,Docker copy命令无法正常工作。

您必须将docker文件向上移动一个目录,以便它们与sln文件处于同一级别。它将解决这个问题。

或者,您可以在不更改docker文件位置的情况下更改以下示例docker文件的路径,因此最好将docker文件与其他文件一起保存。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim-arm64v8 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["WhatzThat.Web.csproj", "WhatzThat.Web/"]
RUN dotnet restore "WhatzThat.Web/WhatzThat.Web.csproj" -r linux-arm64

WORKDIR "/src/WhatzThat.Web"
COPY . .

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

FROM build AS publish
RUN dotnet publish "WhatzThat.Web.csproj" -c Release -o /app/publish -r linux-arm64 --self-contained false --no-restore

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WhatzThat.Web.dll"]
 类似资料:
  • 我试图建立我的docker形象,但我得到了这个错误。 错误CS5001:程序不包含适合入口点的静态“Main”方法[/6GAG.WebApi/6GAG.WebApi.csproj] 我在一个解决方案中有三个项目。 1 webapi 1个前端应用程序 1类图书馆 我的Dockerfile存在于我的。sln文件是 我的. csproj文件: 如何解决这个问题?

  • 我知道在Java中,静态方法和实例方法一样是继承的,不同的是,当它们被重新声明时,父实现是隐藏的,而不是重写的。好吧,这有道理。但是,Java教程指出 接口中的静态方法从不继承。 然而,

  • 基本上,我正在使用TestNG开发Selenium automation,我想为一个字段获取用户输入,而要获取用户输入,我需要scanner类的帮助。但如果没有主要阶层,它就不起作用。有人能帮我吗?

  • 问题内容: 我写了下面的代码 因此,当我运行它时,它可以正常运行并打印输出“ Hello”。 但是,如果JVM规范要求该main方法应该是公开的,因为“否则它就看不到main”,那么它也不适用于该类吗?如果JVM在未声明为public时“看不到” Hello.main(),它将如何看到类A本身。 除了“因为规范这样说”以外,对此还有什么解释吗? 并且,如果JVM能够看到所有类和方法,因为它本身就是

  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则可以工作。为什么? 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。

  • 问题内容: 我在代码中遇到了python中的未绑定方法错误 在阅读了许多有用的文章之后,我想到了如何在上面添加内容以使代码正常工作。我是python新手。有人可以解释一下为什么要定义静态方法吗?还是为什么不将所有方法都定义为静态方法? 问题答案: 静态方法的使用受到限制,因为它们无法访问类的实例的属性(就像常规方法一样),并且它们也不能访问类本身的属性(就像类方法一样) )。 因此,它们对于日常方