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 消息框中显示以下消息失败了?
这里是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 EC2 实例的 docker 容器中运行的 django
构建 docker 映像时出现问题,运行 dotnet restore:VS2019 中的“No such host is known”,Windows