.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"]
修改说明
- 适配上下文路径:当在Api目录执行
docker build时,构建上下文是FiinGate.Api,因此用../引用同级的其他项目目录,同时保持目标路径为/src下的对应项目文件夹,确保dotnet restore能正确识别依赖关系。 - 调整全量复制逻辑:原Dockerfile用
COPY . .复制整个解决方案根目录,现在分项目复制,先复制当前Api目录内容到/src/FiinGate.Api,再逐一复制同级其他项目到/src对应的文件夹。 - 修正构建工作目录:原路径
/src/src/FiinGate.Api基于解决方案根目录上下文,现在上下文为Api目录,因此调整为/src/FiinGate.Api。
验证方式
在FiinGate.Api目录打开终端,直接执行:
docker build -t fiingate:latest .
即可完成镜像构建。
内容的提问来源于stack exchange,提问作者Minh Giang
相关产品推荐
相关产品推荐

