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

Leo*_*ira 19 c# docker .net-core

我在使用 docker 时遇到了问题,但找不到合适的解决方案。

我正在尝试使用 dotnet sdk 2.1 构建 docker 映像。

问题是当 docker 尝试运行 build 语句时,它失败了,错误输出是

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

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

我已经在项目上检查了我的 LanguageVersion 标签,它是 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"]
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

Ome*_*r K 45

2023 更新

不幸的是,Microsoft 在 Dockerfile 中包含的内容和运行它的目录不一致。

可以通过三种解决方案来完成这项工作。

第一个解决方案

  1. 将自动生成的 Dockerfile 放在 .sln 文件旁边。

  2. 从解决方案的根目录运行以下命令

    docker build -t 镜像名称。


第二种解决方案

  1. 将 Dockerfile 保留在项目文件夹中。

  2. 从解决方案的根目录运行以下命令

    docker build -t imagename -f .\SampleProject\Dockerfile 。


第三种解决方案

对 Dockerfile 进行一些小的更改。现在,您必须从项目文件夹而不是解决方案的根目录运行 docker 命令。(比 .sln 文件低一级)。

从下面开始改变 在此输入图像描述

在此输入图像描述

补充

在此输入图像描述

  • 第三个解决方案是一个很好的例子!对我有用,谢谢 (4认同)

mar*_*ker 37

我知道现在回答有点晚了。VS 2019 仍然存在与 netcore 3.1 相同的问题。我看了一下 Microsoft 提供的示例。结果发现 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"]
Run Code Online (Sandbox Code Playgroud)

  • 我为此苦苦挣扎,就我而言,我已经按照答案中正确的建议对路径进行了大部分调整。事实证明,破坏我的构建步骤的一件事是我有 COPY 。。恢复后的 WORKDIR 命令*之前*命令。一旦我纠正了这个问题,我的构建步骤就起作用了。感谢您的帮助,希望我的额外指针也能帮助某人。 (30认同)
  • 除了删除第一个“副本”上的项目文件夹路径之外,实际上还将“workdir”命令移到“副本...”之前。是这里解决方案的关键部分。原始版本的问题是,我认为它确实*被*编写为从解决方案文件夹运行,并且“COPY . .” 将 *所有* 项目文件夹复制到 src/ (毫无意义 - 这似乎是一个修复了另一个错误的错误)。我只能使用“docker build -t myImage -f myProject\Dockerfile”让它按照编写的方式运行。 (3认同)
  • @CoderSivu 这也为我解决了。想象一下我认为我可以相信 Microsoft 会从 VS2022 提供正确的自动生成模板 Dockerfiles... (2认同)

CSh*_*arp 21

我遇到过同样的问题。
我意识到我的 Docker 文件与 .csproj 文件位于同一级别。我已将 Docker 文件在文件夹结构中上移一级,并且构建正常。


ara*_*ivl 15

使用多项目解决方案结构,我通过再次将“src”添加到要构建的目录中来修复。

像这样的东西:

COPY ["src/Todo.Core/Todo.Core.csproj", "Todo.Core/"]
RUN dotnet restore "Todo.Api/Todo.Api.csproj"
COPY . .
WORKDIR "/src/Todo.Api/"
RUN dotnet build "Todo.Api.csproj" -c Release -o /app/build
Run Code Online (Sandbox Code Playgroud)

变成了这样:

COPY ["src/Todo.Core/Todo.Core.csproj", "Todo.Core/"]
RUN dotnet restore "Todo.Api/Todo.Api.csproj"
COPY . .
WORKDIR "/src/src/Todo.Api/"
RUN dotnet build "Todo.Api.csproj" -c Release -o /app/build
Run Code Online (Sandbox Code Playgroud)


小智 7

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

请在下面找到相同的参考

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