Visual studio 需要.AspNetCore服务的Dockerfile和Kubernetes帮助吗

Visual studio 需要.AspNetCore服务的Dockerfile和Kubernetes帮助吗,visual-studio,docker,asp.net-core,kubernetes,Visual Studio,Docker,Asp.net Core,Kubernetes,由于以下错误,我的docker生成失败: 复制失败:CreateFile\?\C:\ProgramData\Docker\tmp\Docker-builder117584470\Aeros.Services.Kubernetes\Aeros.Services.Kubernetes.csproj:系统找不到指定的路径 我是docker的新手,我使用了创建Kubernetes容器项目模板时设置的基本项目模板,因此我认为它可以开箱即用,但我错了 我在试图找出它在临时目录结构中的原因以及失败的原因时遇到

由于以下错误,我的docker生成失败:

复制失败:CreateFile\?\C:\ProgramData\Docker\tmp\Docker-builder117584470\Aeros.Services.Kubernetes\Aeros.Services.Kubernetes.csproj:系统找不到指定的路径

我是docker的新手,我使用了创建Kubernetes容器项目模板时设置的基本项目模板,因此我认为它可以开箱即用,但我错了

我在试图找出它在临时目录结构中的原因以及失败的原因时遇到了问题。有人能提供一些帮助吗?我做了一些搜索,其他人说Visual Studio中默认的docker模板不正确,但我没有看到任何文件被复制到临时目录中,因此弄清楚发生了什么是相当困难的

这是docker文件,我唯一添加的是publishingProfile参数,这样我就可以告诉它在构建和发布步骤中使用哪个配置文件:

ARG publishingProfile

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

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["Aeros.Services.Kubernetes/Aeros.Services.Kubernetes.csproj", "Aeros.Services.Kubernetes/"]

RUN dotnet restore "Aeros.Services.Kubernetes/Aeros.Services.Kubernetes.csproj"
COPY . ./
WORKDIR "/src/Aeros.Services.Kubernetes"
RUN dotnet build "Aeros.Services.Kubernetes.csproj" -c $publishingProfile -o /app

FROM build AS publish
RUN dotnet publish "Aeros.Services.Kubernetes.csproj" -c $publishingProfile -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Aeros.Services.Kubernetes.dll"]
我还没有接触yaml文件,但如果你需要,我也可以提供它。同样,我所做的就是在项目引用中添加几个NuGet包。内置VisualStudio运行正常,但docker命令:

docker build . --build-arg publishingProfile=Release
正在失败,出现上述错误

有人能提供一些启示吗?谢谢

编辑1:
我正在通过PowerShell命令行从项目文件夹执行此操作。

问题发生在哪一行?我不记得docker build是否显示了这一点

你在哪里执行这个构建?问题是它找不到您试图复制的文件。它应该位于执行命令的地方


我现在明白了,问题出在第一本上

Leandro的评论帮助我们找到了解决方案

因此,首先是该COPY命令的详细说明,它包含两个参数,source和destination。 在Visual Studio Dockerfile的模板中,它包括试图复制的.csproj文件的文件夹位置。在我的例子中,命令如下所示:

COPY ["Aeros.Services.Kubernetes/Aeros.Services.Kubernetes.csproj", "Aeros.Services.Kubernetes/"]
因此,它正在Aeros.Services.Kubernetes项目文件夹中查找我的Aeros.Services.Kubernetes.csproj文件,并将其复制到Docker src文件夹中的Aeros.Services.Kubernetes文件夹中

问题是,如果使用默认设置,dockerfile将包含在项目文件夹中。如果您是从项目文件夹中执行docker生成,则COPY命令的语法实际上查找的文件位置错误。例如,如果您的项目是位于TestApp项目文件夹中的TestApp.csproj,并且您正在为同一文件夹中的Docker文件执行Docker build命令,则该复制命令的语法为:

COPY ["TestApp/TestApp.csproj", "TestApp/"]
实际上正在寻找:TestApp/TestApp/TestApp.csproj

在这种情况下,COPY命令的正确语法应为:

COPY ["TestApp.csproj", "TestApp/"]
因为您已经在TestApp项目文件夹中

默认模板的另一个问题可能会困扰一些人,即它也不会复制项目的web文件,因此,一旦您通过复制和dotnet还原步骤,您将在生成过程中失败,原因是:

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

通过添加以下内容解决此问题:

COPY . ./
按照运行dotnet restore命令复制文件

一旦在提供的默认模板中解决了这些问题,一切都应该按预期运行


谢谢你的帮助

是的,第一份。我想测试docker build命令,所以我设置了这个项目,并尝试运行docker build,看看它是否可以工作。就像我说的,这些都是通过visual studio中的项目模板创建的,所以我认为很多东西都是现成的。你问我是从哪里执行的,我正在通过PowerShell命令行从项目文件夹中执行它。你有这个文件吗:src/Aeros.Services.Kubernetes/Aeros.Services.Kubernetes.csproj?无论如何,这很奇怪。我在docker foruns上发现了一个类似的线程:我想我找到了,这是一个自动生成的docker文件的bug。由于docker文件与.csproj文件位于同一位置,因此不需要在.csproj文件名之前声明文件夹。一旦我把它去掉,那部分就成功了。然后我遇到了无静态main方法错误,这是由于在dotnebuild命令之前没有复制其他文件造成的。我又加了一份在dotnet恢复后,一切似乎都很正常。