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

多Dotnet应用关联Core类库时的Dockerfile构建方案咨询

问题描述

项目结构

solution-folder/
                app1/
                   - app1.csproj
                   - dockerfile
                   - other files
                app2/
                   - app2.csproj
                   - dockerfile
                   - other files
                app3/
                   - app3.csproj
                   - dockerfile
                   - other files
                core/
                   - core.csproj
                   - other files

应用Dockerfile内容

每个app下的Dockerfile初始内容:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS core-build
WORKDIR /src/app/core
COPY ["../core/core.csproj", "/"]

构建报错

执行构建时出现如下错误:

3 |     WORKDIR /src/app/core
   4 |
   5 | >>> COPY ["../core/core.csproj", "/"]
    ------------------------------------
   ERROR: "/core/core.csproj": `not found`

已知Docker构建上下文不允许通过../访问上级目录,考虑将Dockerfile移到solution-folder根目录,但存在三个应用的Dockerfile,是否需要合并?如果不需要,如何生成三个不同应用的镜像?


解决方案

不需要合并Dockerfile,以下两种方案均可解决问题:

方案一:将Dockerfile移至根目录,通过指定构建文件区分应用

  1. 将三个app的Dockerfile分别重命名为Dockerfile.app1、Dockerfile.app2、Dockerfile.app3,放到solution-folder根目录下。
  2. 修改每个Dockerfile的路径配置(以Dockerfile.app1为例),此时构建上下文为根目录,可直接引用相对根目录的路径:
    FROM mcr.microsoft.com/dotnet/sdk:6.0 AS core-build
    WORKDIR /src/core
    COPY ["core/core.csproj", "."]
    RUN dotnet restore
    COPY ["core/", "."]
    
    FROM mcr.microsoft.com/dotnet/sdk:6.0 AS app1-build
    WORKDIR /src/app1
    COPY ["app1/app1.csproj", "."]
    RUN dotnet restore
    COPY ["app1/", "."]
    COPY --from=core-build /src/core /src/core
    RUN dotnet publish -c Release -o /app/publish
    
    FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
    WORKDIR /app
    COPY --from=app1-build /app/publish .
    ENTRYPOINT ["dotnet", "app1.dll"]
    
  3. 在solution-folder根目录执行对应构建命令生成镜像:
    # 构建app1镜像
    docker build -t app1-image -f Dockerfile.app1 .
    # 构建app2镜像
    docker build -t app2-image -f Dockerfile.app2 .
    # 构建app3镜像
    docker build -t app3-image -f Dockerfile.app3 .
    

方案二:保留Dockerfile原位置,指定根目录为构建上下文

  1. 不移动Dockerfile,执行构建时将上下文指定为solution-folder根目录,通过-f参数指定对应app的Dockerfile路径。
  2. 修改每个app下Dockerfile的路径配置(以app1下的Dockerfile为例),适配根目录上下文:
    FROM mcr.microsoft.com/dotnet/sdk:6.0 AS core-build
    WORKDIR /src/core
    COPY ["core/core.csproj", "."]
    RUN dotnet restore
    COPY ["core/", "."]
    
    FROM mcr.microsoft.com/dotnet/sdk:6.0 AS app1-build
    WORKDIR /src/app1
    COPY ["app1/app1.csproj", "."]
    RUN dotnet restore
    COPY ["app1/", "."]
    COPY --from=core-build /src/core /src/core
    RUN dotnet publish -c Release -o /app/publish
    
    FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
    WORKDIR /app
    COPY --from=app1-build /app/publish .
    ENTRYPOINT ["dotnet", "app1.dll"]
    
  3. 在solution-folder根目录执行构建命令:
    # 构建app1镜像
    docker build -t app1-image -f app1/Dockerfile .
    # 构建app2镜像
    docker build -t app2-image -f app2/Dockerfile .
    # 构建app3镜像
    docker build -t app3-image -f app3/Dockerfile .
    

核心说明

Docker构建上下文是执行docker build时指定的目录(命令末尾的.),只有上下文内的文件能被COPY指令访问。两种方案的核心都是让上下文包含core和目标app的所有文件,避免跨上下文的../路径引用。

内容的提问来源于stack exchange,提问作者Ali CAKIL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:23:13