使用不同目录上下文构建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
相关产品推荐
相关产品推荐

