提问人:Fábio Carvalho 提问时间:10/16/2023 更新时间:10/17/2023 访问量:74
在 Docker 中运行多项目 .NET 6 应用程序时遇到问题
Trouble Running a Multi-Project .NET 6 Application in Docker
问:
我正在开发一个包含多个项目(Web、服务、数据)的 .NET 6 应用程序,我正在尝试使用 Docker 将其容器化。我组织了我的 Dockerfile 和项目结构如下:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["./1-web/GGWebApp/GGWebApp.csproj", "GGWebApp/"]
COPY ["./2-services/GGServices/GGServices.csproj", "GGServices/"]
COPY ["./3-data/GGData/GGData.csproj", "GGData/"]
RUN dotnet restore "GGServices/GGServices.csproj"
RUN dotnet restore "GGData/GGData.csproj"
RUN dotnet restore "GGWebApp/GGWebApp.csproj"
COPY . .
WORKDIR "/src/GGWebApp"
RUN dotnet build "GGWebApp.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "GGWebApp.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "GGWebApp.dll"]
我遇到了找不到服务项目的问题,并且程序 .cs 可能无法加载。但是,我的主要问题是我无法使用此设置正确构建和运行应用程序。
我希望学习如何从头开始启动应用程序,并能够运行我的 Docker 映像,而不会遇到很多类库依赖项的麻烦。
我试图在 Stack Overflow 上遵循一些教程和其他一些问题,但我没有成功。事实上,我的 Docker 设置似乎越来越糟,我目前正面临类库依赖项的问题。
我还尝试使用Docker Compose来简化该过程,但这也没有用。
此外,我已经在 Stack Overflow 上检查了这两个相关问题,但它们并没有完全解决我的问题:
您能否提供有关如何为多项目 .NET 6 应用程序构建我的 Dockerfile 的指导,确保包含所有必需的依赖项?此外,对解决“主要”切入点问题的任何见解将不胜感激。
具体来说,我想知道如何在 .NET 6 中处理多项目解决方案的 Dockerfile 依赖项。
感谢您的帮助!
答:
在对 .NET 应用程序的 Dockerfile 进行故障排除的过程中,我遇到了与不正确的文件路径相关的问题,这导致了生成和运行时问题。以下是我识别和解决问题的方法:
初始 Dockerfile: 我有一个初始的 Dockerfile,其中包含 dotnet build 和 dotnet publish 等命令的“./1-web/GGWebApp/GGWebApp.csproj”等路径。这些路径似乎是相对于初始 WORKDIR 的。
问题识别: 很明显,初始 Dockerfile 中指定的路径不正确。这是生成错误的主要原因。运行 dotnet build 和 dotnet publish 时,它们无法在提供的路径中找到项目文件,从而导致错误。
更正了 Dockerfile: 为了解决这个问题,我使用更正后的路径更新了 Dockerfile,特别是“./1-web/GGWebApp/GGWebApp.csproj”。这些路径已调整,以反映项目结构中的正确相对路径。
结果: 使用更正后的路径,我的 Dockerfile 在容器中成功构建并发布了我的 .NET 应用程序,使其能够正常运行而不会出错。
总结: 解决此问题的关键是识别初始 Dockerfile 中的错误文件路径。通过更新这些路径以匹配实际的项目结构,我能够创建一个完美运行的 Dockerfile,确保在 Docker 容器中成功部署我的 .NET 应用程序。
此过程强调了 Dockerfile 中准确路径定义的重要性,因为在构建和执行容器化应用程序期间,不正确的路径可能会导致各种问题。通过识别和纠正路径差异,我可以确保我的项目顺利部署 Docker
最终 Dockerfile:
# Use the official .NET SDK image from Microsoft
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
# Copy the project files for all layers (1-web, 2-services, 3-data)
COPY ./1-web/GGWebApp/GGWebApp.csproj ./1-web/GGWebApp/
COPY ./2-services/GGServices/GGServices.csproj ./2-services/GGServices/
COPY ./3-data/GGData/GGData.csproj ./3-data/GGData/
# Restore dependencies for all layers
RUN dotnet restore ./1-web/GGWebApp/GGWebApp.csproj
RUN dotnet restore ./2-services/GGServices/GGServices.csproj
RUN dotnet restore ./3-data/GGData/GGData.csproj
# Copy the entire solution
COPY . .
# Build the solution
# Build the solution
RUN dotnet build "./1-web/GGWebApp/GGWebApp.csproj" -c Release -o /app/build
# Publish the application
FROM build AS publish
RUN dotnet publish "./1-web/GGWebApp/GGWebApp.csproj" -c Release -o /app/publish
# Build the runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "GGWebApp.dll"]
通常,你希望将任何 Docker 化 .NET 应用的生成上下文设置为解决方案目录 - 这意味着所有项目都包含在生成上下文中,并在生成时发送到守护程序。
为此,可以从解决方案目录运行 build 命令,并传入要使用该标志生成的 Dockerfile。下面是以下解决方案结构的示例:-f
.
├── MySolution.sln
└── src
├── MyProject1
│ └── MyProject1.csproj
└── MyProject2
└── MyProject2.csproj
构建映像:
jhmck@example:/development/MySolution1> docker build -f ./src/MyProject1/Dockerfile -t MyProject1:latest .
重要提示:命令末尾的句点指定生成上下文目录。 指当前(解决方案)目录。.
这确实意味着您必须以一种考虑到这一点的方式编写 Dockerfile。所有命令都将使用生成上下文目录作为其基础,因此需要从它(解决方案根目录)路径到要复制的任何内容:COPY
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["src/MyProject1/MyProject1.csproj", "src/MyProject1/"]
RUN dotnet restore "src/MyProject1/MyProject1.csproj"
评论