You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core容器化:实现从项目目录而非解决方案目录构建镜像

直接在Api目录执行Docker Build的解决方案

项目目录结构

FiinGate
|── Fiingate.sln
├── src
│   ├── FiinGate.Api
|   |   ├── FiinGate.Api.csproj
│   │   ├── Dockerfile
│   │   ├── .dockerignore
│   │   ├── ...
│   ├── FiinGate.Application
│   │   ├── FiinGate.Application.csproj
|   |   ├── ...
│   ├── FiinGate.Infrastructure
│   │   ├── FiinGate.Infrastructure.csproj
|   |   ├── ...
│   ├── FiinGate.Core
│   │   ├── FiinGate.Core.csproj
|   |   ├── ...
│   ├── FiinGate.Domain
│   │   ├── FiinGate.Domain.csproj
|   |   ├── ...
│   ├── FiinGate.Localizer
│   │   ├── FiinGate.Localizer.csproj
|   |   ├── ...
│   ├── FiinGate.Templates
│   │   ├── FiinGate.Templates.csproj
|   |   |── ...

当前问题

原Dockerfile由Visual Studio生成,默认以解决方案根目录作为构建上下文。直接在FiinGate.Api目录下执行docker build -t fiingate:latest .会因路径匹配失败报错,目前只能切换到解决方案根目录指定Dockerfile路径,或通过docker-compose指定上下文才能构建成功,操作不够便捷。

修改后的Dockerfile

替换FiinGate.Api目录下的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

# 调整csproj文件的COPY路径,适配Api目录作为构建上下文
COPY ["FiinGate.Api.csproj", "FiinGate.Api/"]
COPY ["../FiinGate.Application/FiinGate.Application.csproj", "FiinGate.Application/"]
COPY ["../FiinGate.Core/FiinGate.Core.csproj", "FiinGate.Core/"]
COPY ["../FiinGate.Domain/FiinGate.Domain.csproj", "FiinGate.Domain/"]
COPY ["../FiinGate.Infrastructure/FiinGate.Infrastructure.csproj", "FiinGate.Infrastructure/"]
COPY ["../FiinGate.Localizer/FiinGate.Localizer.csproj", "FiinGate.Localizer/"]
COPY ["../FiinGate.Templates/FiinGate.Templates.csproj", "FiinGate.Templates/"]

# 恢复Api项目依赖
RUN dotnet restore "FiinGate.Api/FiinGate.Api.csproj"

# 分项目复制代码,保持/src下的项目结构
COPY . ./FiinGate.Api/
COPY ../FiinGate.Application ./FiinGate.Application/
COPY ../FiinGate.Core ./FiinGate.Core/
COPY ../FiinGate.Domain ./FiinGate.Domain/
COPY ../FiinGate.Infrastructure ./FiinGate.Infrastructure/
COPY ../FiinGate.Localizer ./FiinGate.Localizer/
COPY ../FiinGate.Templates ./FiinGate.Templates/

# 切换到Api项目目录执行构建
WORKDIR "/src/FiinGate.Api"
RUN dotnet build "FiinGate.Api.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "FiinGate.Api.csproj" -c Release -o /app/publish /p:UseAppHost=false

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

修改说明

  1. 适配上下文路径:当在Api目录执行docker build时,构建上下文是FiinGate.Api,因此用../引用同级的其他项目目录,同时保持目标路径为/src下的对应项目文件夹,确保dotnet restore能正确识别依赖关系。
  2. 调整全量复制逻辑:原Dockerfile用COPY . .复制整个解决方案根目录,现在分项目复制,先复制当前Api目录内容到/src/FiinGate.Api,再逐一复制同级其他项目到/src对应的文件夹。
  3. 修正构建工作目录:原路径/src/src/FiinGate.Api基于解决方案根目录上下文,现在上下文为Api目录,因此调整为/src/FiinGate.Api。

验证方式

在FiinGate.Api目录打开终端,直接执行:

docker build -t fiingate:latest .

即可完成镜像构建。

内容的提问来源于stack exchange,提问作者Minh Giang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:25:31