Docker 在 VS 中运行,但在发布到 AWS 时出错?错误 CS5001:程序不包含适用于入口点的静态“Main”方法

Posted

技术标签:

【中文标题】Docker 在 VS 中运行,但在发布到 AWS 时出错?错误 CS5001:程序不包含适用于入口点的静态“Main”方法【英文标题】:Docker runs in VS but got error when publishing to AWS? error CS5001: Program does not contain a static 'Main' method suitable for an entry point 【发布时间】:2018-11-24 14:31:45 【问题描述】:

我为 Visual Studio 2017 (V15.7.3) 安装了 AWS 工具包,并创建了一个新的空 Asp.Net core 2.1 项目,该项目具有 API 模板和 Linux docker 支持。我可以在 Visual Studio 中运行它。

加载项目后的 Visual Studio Docker 输出

========== 准备容器 ========== 准备好 Docker 容器... docker-compose -f "C:\work\Strats\docker-compose.yml" -f "C:\work\Strats\docker-compose.override.yml" -f "C:\work\Strats\obj\Docker \docker-compose.vs.debug.g.yml" -p dockercompose607729401690719332 --no-ansi 配置 DOCKER_REGISTRY 变量未设置。默认为空字符串。 服务: 进程文件: 建造: 上下文:C:\work\Strats dockerfile:进程文件/Dockerfile 目标:基地 入口点:tail -f /dev/null 环境: ASPNETCORE_ENVIRONMENT:开发 ASPNETCORE_HTTPS_PORT: '44347' ASPNETCORE_URLS:https://+:443;http://+:80 DOTNET_USE_POLLING_FILE_WATCHER:'1' NUGET_FALLBACK_PACKAGES:/root/.nuget/fallbackpackages 图片:进程文件:开发 标签: com.microsoft.visualstudio.debuggee.arguments:'--additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages bin/Debug/netcoreapp2.1/ProcessFiles.dll' com.microsoft.visualstudio.debuggee.killprogram: /bin/bash -c "如果 PID=$$(pidof -x 点网);然后杀死$$PID;菲” com.microsoft.visualstudio.debuggee.program:dotnet com.microsoft.visualstudio.debuggee.working 目录:/app 端口: - 发表:49971 目标:80 - 发表:44347 目标:443 卷: - C:\work\Strats\ProcessFiles:/app:rw - C:\Users\...\vsdbg\vs2017u5:/remote_debugger:ro - C:\Users\...\AppData\Roaming\ASP.NET\Https:/root/.aspnet/https:ro - C:\Users\...\AppData\Roaming\Microsoft\UserSecrets:/root/.microsoft/usersecrets:ro - C:\Program Files\dotnet\sdk\NuGetFallbackFolder:/root/.nuget/fallbackpackages:ro - C:\Users\...\.nuget\packages:/root/.nuget/packages:ro 版本:'3.4' docker ps --filter "status=running" --filter "name=dockercompose607729401690719332_processfiles_" --format .ID -n 1 docker-compose -f "C:\work\Strats\docker-compose.yml" -f "C:\work\Strats\docker-compose.override.yml" -f "C:\work\Strats\obj\Docker \docker-compose.vs.debug.g.yml" -p dockercompose607729401690719332 --no-ansi build DOCKER_REGISTRY 变量未设置。默认为空字符串。 构建过程文件 步骤 1/4 : FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base ---> 04aae08f15c5 步骤 2/4:工作目录 /app ---> 使用缓存 ---> 135955e04284 步骤 3/4:暴露 49971 ---> 使用缓存 ---> 2e1bb95e0d70 步骤 4/4:暴露 44347 ---> 使用缓存 ---> 89dc3708552d 成功搭建89dc3708552d 成功标记 processfiles:dev docker-compose -f "C:\work\Strats\docker-compose.yml" -f "C:\work\Strats\docker-compose.override.yml" -f "C:\work\Strats\obj\Docker \docker-compose.vs.debug.g.yml" -p dockercompose607729401690719332 --no-ansi up -d --no-build --force-recreate --remove-orphans DOCKER_REGISTRY 变量未设置。默认为空字符串。 使用默认驱动程序创建网络“dockercompose607729401690719332_default” 创建 dockercompose607729401690719332_processfiles_1 ... 创建 dockercompose607729401690719332_processfiles_1 ...完成 完毕! Docker 容器已准备就绪。

在 Visual Studio 中运行时的 Docker 输出

========== 调试 ========== docker ps --filter "status=running" --filter "name=dockercompose607729401690719332_processfiles_" --format .ID -n 1 1cad14cb758c 启动 https://localhost:44347/api/values ...

Visual Studio 构建输出

1>----- 构建开始:项目:docker-compose,配置:调试任何 CPU ------ 1>docker ps --filter "status=running" --filter "name=dockercompose607729401690719332_processfiles_" --format .ID -n 1 1>1cad14cb758c 1>docker exec -i 1cad14cb758c /bin/bash -c “如果 PID=$(pidof -x dotnet); 然后杀死 $PID;fi” 1>C:\work\Strats\ProcessFiles\ProcessFiles.csproj:警告 NU1701:使用 '.NETFramework,Version=v4.6.1' 而不是项目目标框架'来恢复包'System.Linq.Queryable 4.0.1'。 NETCoreApp,版本=v2.1'。此软件包可能与您的项目不完全兼容。 1>ProcessFiles -> C:\work\Strats\ProcessFiles\bin\Debug\netcoreapp2.1\ProcessFiles.dll 1>完成构建项目“ProcessFiles.csproj”。 1>docker-compose -f "C:\work\Strats\docker-compose.yml" -f "C:\work\Strats\docker-compose.override.yml" -f "C:\work\Strats\obj \Docker\docker-compose.vs.debug.g.yml" -p dockercompose607729401690719332 --no-ansi up -d 1> DOCKER_REGISTRY 变量未设置。默认为空字符串。 1>dockercompose607729401690719332_processfiles_1 是最新的 ========== 构建:1 个成功或最新,0 个失败,0 个跳过 ==========

所以它运行并在浏览器中显示默认值 api 示例。

现在我在修复Dockerfile (Docker for Windows building added prefix `/var/lib/docker/tmp/` for COPY?) 后右键单击该项目并单击“将容器发布到AWS...”。但是,它在 AWS 消息框中显示以下消息失败了?

检查 Dockerfile 以了解如何构建项目和 docker 映像 ...跳过构建项目,因为它是作为 Dockerfile 的一部分完成的 执行 docker 构建 ... 调用“docker build”,工作文件夹“C:\work\Strats\ProcessFiles,docker 文件 C:\work\Strats\ProcessFiles\Dockerfile,图像名称 processfiles:latest” ... docker build:将构建上下文发送到 Docker 守护进程 1.176MB ... docker build: Step 1/17 : FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base ... 码头工人构建:---> 04aae08f15c5 ... docker build:步骤 2/17:WORKDIR /app ... docker build: ---> 使用缓存 ...码头建设:---> 135955e04284 ... docker build:步骤 3/17:EXPOSE 49971 ... docker build: ---> 使用缓存 ... 码头工人构建:---> 2e1bb95e0d70 ... docker build:步骤 4/17:EXPOSE 44347 ... docker build: ---> 使用缓存 ... 码头工人构建:---> 89dc3708552d ... docker build:步骤 5/17:来自 microsoft/dotnet:2.1-sdk AS build ... 码头工人构建:---> 7c3e298d40ac ... docker build:步骤 6/17:WORKDIR /src ... docker build: ---> 使用缓存 ... 码头工人构建:---> 6b6446592420 ... docker build:步骤 7/17:复制 ProcessFiles.csproj ProcessFiles/ ...码头工人构建:---> 024a84501cff ... docker build:步骤 8/17:运行 dotnet restore ProcessFiles/ProcessFiles.csproj ... docker build: ---> 在 1ef41c99d3bc 中运行 ... docker build:恢复 /src/ProcessFiles/ProcessFiles.csproj 的包... ... docker build:生成 MSBuild 文件 /src/ProcessFiles/obj/ProcessFiles.csproj.nuget.g.props。 ... docker build:生成 MSBuild 文件 /src/ProcessFiles/obj/ProcessFiles.csproj.nuget.g.targets。 ... docker build:/src/ProcessFiles/ProcessFiles.csproj 的恢复在 770.82 毫秒内完成。 ... docker build:删除中间容器 1ef41c99d3bc ... 码头工人构建:---> 276efaf02bd4 ... docker build:步骤 9/17:复制。 . ...码头建设:---> 128814476275 ... docker build:步骤 10/17:WORKDIR /src/ProcessFiles ... docker build:删除中间容器 004eb873b480 ... 码头工人构建:---> 8c1741062d87 ... docker build:步骤 11/17:运行 dotnet build ProcessFiles.csproj -c Release -o /app ... docker build: ---> 在 fd25517b7941 中运行 ... docker build:适用于 .NET Core 的 Microsoft (R) Build Engine 版本 15.7.179.6572 ... docker build:版权所有 (C) Microsoft Corporation。版权所有。 ... docker build:/src/ProcessFiles/ProcessFiles.csproj 的恢复在 55.9 毫秒内完成。 ... docker build:CSC:错误 CS5001:程序不包含适合入口点的静态“主要”方法 [/src/ProcessFiles/ProcessFiles.csproj] ... docker build:构建失败。 ... docker build:CSC:错误 CS5001:程序不包含适合入口点的静态“主要”方法 [/src/ProcessFiles/ProcessFiles.csproj] ... docker build: 0 警告 ... docker build: 1 错误 ... docker build: Time Elapsed 00:00:02.56 ... docker build:命令 '/bin/sh -c dotnet build ProcessFiles.csproj -c Release -o /app' 返回一个非零代码:1 执行“docker build”时出错 尝试清理为失败的部署创建的任何 ELB 资源 将容器发布到 AWS 的未知错误

这里是VS创建的main方法。

namespace ProcessFiles

    public class Program
    
        public static void Main(string[] args)
        
            CreateWebHostBuilder(args).Build().Run();
        

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    

Dockerfile

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 49971
EXPOSE 44347

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ProcessFiles.csproj ProcessFiles/
RUN dotnet restore ProcessFiles/ProcessFiles.csproj
COPY . .
WORKDIR /src/ProcessFiles
RUN dotnet build ProcessFiles.csproj -c Release -o /app

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

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

【问题讨论】:

你能添加你的 Dockerfile 内容吗?我怀疑您实际上并没有将源文件复制到构建上下文中。一个空的项目文件夹会产生这个错误;我在升级到dotnet:2.1-sdk 时遇到了同样的问题 我在问题的最后添加了由visual studio生成的Dockerfile。 嗯,这显然不是错误的,但谁知道呢。您可以运行中间容器以查看可能缺少的内容。例如,从上面的日志中,就在Step 10/17 : WORKDIR /src/ProcessFiles 之后,您可以获取结果哈希8c1741062d87 并在那里使用docker run -it 8c1741062d87 bash 启动一个shell。这将让您环顾四周,看看是否所有预期的文件都被正确复制,甚至可以尝试手动构建。 有趣。我试过docker run -it (from step 10/17) bash,只在/src/ProcessFiles下找到文件ProcessFiles.csproj和一个目录obj。我在/src/bin/Debug/netcoreapp2.1文件夹下找到了一些真正的可执行文件。 是的,这是有道理的。所以现在你必须弄清楚为什么 .cs 文件没有被复制。你在那里有COPY . . 行,所以也许有一个.dockerignore 在某个地方隐藏它们? 【参考方案1】:

构建阶段的路径很不稳定。您的项目文件被复制到子文件夹/src/ProcessFiles,但源文件被复制到/src。在复制之前设置WORKDIR 应该可以让它们到达正确的位置。

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ProcessFiles.csproj ProcessFiles/
RUN dotnet restore ProcessFiles/ProcessFiles.csproj
WORKDIR /src/ProcessFiles
COPY . .
RUN dotnet build ProcessFiles.csproj -c Release -o /app

【讨论】:

仅供参考。该文件实际上是由 Visual Studio 生成的。这听起来像是一个 Visual Studio 错误。 是的,我已经学会了使用 Visual Studio 提供的 Docker 模板,其中包含大量的盐。 它帮助我构建,但现在运行后,我得到 404

以上是关于Docker 在 VS 中运行,但在发布到 AWS 时出错?错误 CS5001:程序不包含适用于入口点的静态“Main”方法的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS 任务中运行两个 docker 镜像

将夹具上传到在 AWS EC2 实例的 docker 容器中运行的 django

从VS2019开始运行Docker容器的问题

构建 docker 映像时出现问题,运行 dotnet restore:VS2019 中的“No such host is known”,Windows

如何使用非默认运行参数在 AWS Elastic Beanstalk 中运行 Docker 容器?

AWS EB Deploy 在部署后显示缺少 Dockerrun.aws.json