我有以下 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 新手。
谢谢。
我的意思是 Docker 中唯一完全复制的代码是 Ordering.API 代码,来自:
COPY . Services/Ordering/
查看COPY命令说明:
COPY [--chown=<user>:<group>] [--chmod=<perms>] <src>... <dest>
指令从COPY
复制新文件或目录,并将它们添加到路径<src>
处的容器文件系统中。<dest>
因此它实际上会从 docker 构建上下文复制所有内容,通常是存储库的根文件夹。在您的情况下,包含
Ordering.{ProjectName}
的文件夹似乎是构建上下文。