visual-studio - 需要有关.AspNetCore服务的Dockerfile和Kubernetes的帮助

标签 visual-studio docker asp.net-core kubernetes

我的Docker构建由于以下错误而失败:

COPY failed: CreateFile \?\C:\ProgramData\Docker\tmp\docker-builder117584470\Aeros.Services.Kubernetes\Aeros.Services.Kubernetes.csproj: The system cannot find the path specified.



我对Docker并不陌生,并且使用了创建Kubernetes容器项目模板时设置的基本项目模板,因此我认为它可以立即使用,但我弄错了。

我在尝试弄清它在临时目录结构中的作用以及失败的原因时遇到问题。谁能提供帮助?我已经进行了一些搜索,其他人则说默认的docker模板在Visual Studio中是不正确的,但是我没有看到任何文件被复制到temp目录中,因此现在弄清楚了正在发生什么。当时很成问题。

这是docker文件,我唯一添加的是PublishingProfile arg,因此我可以告诉它在Build和Publish步骤中使用哪个配置文件:
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命令行从项目的文件夹中执行此操作。

最佳答案

Leandro的评论有助于解决方案。

因此,首先对该COPY命令进行精简,它需要两个参数:源和目标。
在适用于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 build,则COPY命令的语法实际上是在错误的文件位置中查找。例如,如果您的项目是位于TestApp项目文件夹中的TestApp.csproj,并且您正在同一文件夹内的dockerfile执行Docker build命令,则该COPY命令的语法为:
COPY ["TestApp/TestApp.csproj", "TestApp/"]

实际上正在寻找:TestApp / TestApp / TestApp.csproj。

在这种情况下,COPY命令的正确语法应为:
COPY ["TestApp.csproj", "TestApp/"]

因为您已经在TestApp项目文件夹中。

默认模板的另一个问题可能是有些麻烦,那就是它也不会复制项目的Web文件,因此,一旦经过COPY和dotnet还原步骤,您将在构建过程中失败并显示以下内容:

CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point



这可以通过添加以下内容来解决:
COPY . ./

按照RUN dotnet restore命令复制文件。

在提供的默认模板中解决了这些问题后,所有功能均应按预期运行。

谢谢您的帮助!

关于visual-studio - 需要有关.AspNetCore服务的Dockerfile和Kubernetes的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55289304/

相关文章:

c# - 将 ZipArchive 与 ASP.NET Core Web Api 结合使用

docker - 来自守护程序 : attaching to network failed, 的错误响应请确保您的网络选项正确并检查管理器日志:超出了上下文截止日期

docker - 为什么 jib dockerBuild 插件无法连接

asp.net-core - 如何在环境已知之前加载 appSettings.{environment}.json ? (ASPNetCore)

c# - 连接池中处于 TIME_WAIT 状态的许多连接,在 WebApi 中使用静态或单个 HttpClient 实例

awk - 来自 docker-machine 中 awk 的意外行为

c++ - 删除 msvc dll 依赖以运行 qt 应用程序

c# - 在同一解决方案中针对服务器运行集成测试

c++ - Visual C++ 不会创建 dll 文件并在 *.lib 处停止

typescript - Visual Studio 2019 : Not showing Typescript Intellisence