.NET 6 Minimal API Docker问题:错误CS5001:程序不包含适用于入口点的静态'Main'方法。

4

我看过很多类似的问题,但是似乎没有一个可以准确地代表我面临的问题。当我创建以下文件夹结构时:

./
./src
./src/test

然后导航到./src/test并运行dotnet new webapi -lang c#,这将创建一个能正常工作的最小API。我也可以无问题地运行dotnet publish -c RELEASE -o out /p:Version=1.0.0

然后我尝试在根目录创建一个 Docker 文件,其内容如下:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build

ARG BUILDCONFIG=RELEASE
ARG VERSION=1.0.0

COPY ./src/test/test.csproj ./src/test/
RUN dotnet restore ./src/test/test.csproj

COPY ./src/ ./
WORKDIR ./src/test/
RUN dotnet publish -c $BUILDCONFIG -o out /p:Version=$VERSION

FROM mcr.microsoft.com/dotnet/sdk:6.0
WORKDIR /app
COPY --from=build /src/test/out ./

EXPOSE 5000
ENTRYPOINT ["dotnet", "test.dll"]

我得到了以下输出:
 => ERROR [build 6/6] RUN dotnet publish -c RELEASE -o out /p:Version=1.0.0                                        2.5s
------
 > [build 6/6] RUN dotnet publish -c RELEASE -o out /p:Version=1.0.0:
#11 0.511 Microsoft (R) Build Engine version 17.1.0+ae57d105c for .NET
#11 0.511 Copyright (C) Microsoft Corporation. All rights reserved.
#11 0.511
#11 0.931   Determining projects to restore...
#11 1.153   All projects are up-to-date for restore.
#11 2.400 CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point [/src/test/test.csproj]

我尝试了一些方法,包括在 csproj 中设置 OutputTypeExe,将 DockerDefaultTargetOS 设置为 win/linux,以及其他一些我在其他帖子中找到的建议,但最终我始终遇到相同的错误。有什么想法可能是错的吗?

2个回答

6

错误信息不够清晰。

真正的错误出现在COPY ./src/ ./这一行。通过这个命令,将src文件夹(test)的内容复制到容器的根目录中。

应该是COPY ./src/ /src/或者(更好的选择)./src /src

试着注释掉除前9行以外的所有内容,然后构建容器并运行

docker run --rm -it <imagename> /bin/sh去看看自己。

由于您尝试构建一个空文件夹,编译器会报错,说找不到主方法(实际上什么都没有找到...)。


1
我在Mac上使用Visual Studio(预览版)时遇到了同样的问题。将Dockerfile移动到解决方案根目录中,然后一切就正常工作了。
由于某种原因,Visual Studio在右键单击 > 添加 > 添加Docker支持后将Dockerfile放在了\Users\robk\git\Play-With-Containers\Play-With-Containers\Dockerfile位置。(这也是.csproj文件所在的位置)
将Dockerfile拖到上一级目录\Users\robk\git\Play-With-Containers,然后它就可以工作了。

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