C#项目如何包含在Docker容器中?

问题描述 投票:0回答:1

我有以下 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
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["Ordering.API/Ordering.API.csproj", "Services/Ordering/Ordering.API/"]
COPY ["Ordering.Application/Ordering.Application.csproj", "Services/Ordering/Ordering.Application/"]
COPY ["Ordering.Core/Ordering.Core.csproj", "Services/Ordering/Ordering.Core/"]
COPY ["Ordering.Infrastructure/Ordering.Infrastructure.csproj", "Services/Ordering/Ordering.Infrastructure/"]

RUN dotnet restore "Services/Ordering/Ordering.API/Ordering.API.csproj"
COPY . Services/Ordering/
WORKDIR "/src/Services/Ordering/Ordering.API"
RUN dotnet build "Ordering.API.csproj" -c Release -o /app/build

FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./Ordering.API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

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

这是具有相关层依赖关系的项目结构:

我的问题是:

为什么只需将 .csproj 文件复制到 Docker 容器中,就能找到/包含整个代码?我的意思是,在 Docker 中完全复制的唯一代码是 Ordering.API 代码,来自:

COPY . Services/Ordering/

这个项目为何仅通过可用的 .csproj 文件就可以从依赖层(非 Ordering.API 项目)创建/解析所有其他代码? 由于依赖项目的代码在容器中不可用,dotnet Restore 不应该失败吗?复制的唯一代码来自 Ordering.API.. 据我了解,依赖的 .dll 也已构建并包含在 Ordering.API dll 中,但是如果这些 .dll 的“主要”代码没有导入到 Docker 中(同样,除了它们的 .csproj 文件),那么如何创建这些 .dll 呢?抱歉,我也是 Dockerfile 新手。

谢谢。

c# docker dockerfile
1个回答
0
投票

我的意思是 Docker 中唯一完全复制的代码是 Ordering.API 代码,来自:

COPY . Services/Ordering/

查看COPY命令说明:

COPY [--chown=<user>:<group>] [--chmod=<perms>] <src>... <dest>
COPY
指令从
<src>
复制新文件或目录,并将它们添加到路径
<dest>
处的容器文件系统中。

因此它实际上会从 docker 构建上下文复制所有内容,通常是存储库的根文件夹。在您的情况下,包含

Ordering.{ProjectName}
的文件夹似乎是构建上下文。

© www.soinside.com 2019 - 2024. All rights reserved.