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

使用不同目录上下文构建Docker镜像的技术咨询

搞定Docker Compose跨目录上下文的实用方案

嘿,看起来你已经成功用docker-compose构建了MongoDB、RabbitMQ和.NET Core的镜像,但因为Project1依赖Util目录的代码,需要让Docker Compose能覆盖这两个目录的上下文对吧?下面给你几个靠谱的解决办法:

方案1:直接用根目录作为上下文(首推)

既然你的docker-compose.yml已经在根目录了,最省事的方式就是把构建上下文设为当前目录(.),然后在.NET Core服务的Dockerfile里指定正确的路径复制代码就行。

举个例子,假设你的.NET Core服务的Dockerfile放在Project1/Dockerfile,内容可以这么写:

# 构建阶段
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src

# 先复制Util类库的项目文件并还原依赖
COPY Util/Util.csproj Util/
RUN dotnet restore Util/Util.csproj

# 再复制主服务的项目文件并还原
COPY Project1/Project1.csproj Project1/
RUN dotnet restore Project1/Project1.csproj

# 复制所有源代码(包括Util和Project1)
COPY . .

# 构建主服务
WORKDIR /src/Project1
RUN dotnet build -c Release -o /app/build

# 发布阶段
FROM build AS publish
RUN dotnet publish -c Release -o /app/publish

# 运行阶段
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Project1.dll"]

然后在根目录的docker-compose.yml里配置这个服务:

version: '3.8'
services:
  mongodb:
    image: mongo:latest
    ports:
      - "27017:27017"
    volumes:
      - mongodb_data:/data/db

  rabbitmq:
    image: rabbitmq:3-management
    ports:
      - "5672:5672"
      - "15672:15672"
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq

  dotnet-service:
    build:
      context: .  # 根目录作为上下文,这样就能访问到Util和Project1
      dockerfile: Project1/Dockerfile
    ports:
      - "5000:80"
    depends_on:
      - mongodb
      - rabbitmq

volumes:
  mongodb_data:
  rabbitmq_data:

这种方式的好处是不需要额外折腾,Docker Compose会把根目录下的所有内容(包括Util和Project1)作为构建上下文传递给Docker,你的Dockerfile就能轻松获取到依赖的类库代码了。

方案2:精准指定上下文包含的目录(Docker 23.0+支持)

如果你不想把根目录里所有文件都塞进构建上下文(比如有一些无关的配置或缓存文件),可以用Docker 23.0以上版本支持的include指令,只包含需要的目录:

dotnet-service:
  build:
    context: .
    dockerfile: Project1/Dockerfile
    include:
      - Util/**
      - Project1/**

这样只会把Util和Project1目录的内容作为构建上下文,减少不必要的文件传输,能稍微提升一点构建速度。

几个重要的注意点

  • 一定要配置好.dockerignore文件,把bin/、obj/、.git/这些不需要的文件或目录排除掉,避免构建上下文过大拖慢速度。
  • 因为你的主项目依赖Util类库,所以在Dockerfile里一定要先还原Util的依赖,再还原主项目的,不然构建过程会报错找不到类库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:55:17