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

为何通过Docker Compose构建镜像会包含源码文件?

问题描述

我有如下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 publish
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app/publish

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

将其放在指定目录后,通过Windows CMD构建镜像并运行,容器内/app文件夹仅包含发布后的文件;但通过Visual Studio中的docker-compose.yml构建运行时,容器内不仅有额外文件,还出现了/src文件夹及源码文件。

对应的docker-compose.yml内容如下:

version: '3.4'

services:
  hrmanagement:
    image: ${DOCKER_REGISTRY-}hrmanager
    build:
      context: ./HrManagement
      dockerfile: ./Dockerfile

  sqldata:
    image: mcr.microsoft.com/mssql/server:latest
    environment:
      - SA_PASSWORD=mypass
      - ACCEPT_EULA=Y
    ports:
      - "1450:1433"
    volumes:
      - sql-server-vol:/var/opt/mssql

volumes:
  sql-server-vol:
    external: true

请问为何使用同一Dockerfile通过上述两种方式构建,会出现此差异?

原因说明
  • Visual Studio针对Docker Compose做了开发友好的默认增强:当你通过VS启动docker-compose项目时,它会自动生成额外的临时配置,给你的服务添加绑定挂载(bind mount),把本地项目目录直接挂载到容器内的/src和/app目录下。这么做是为了实现代码热重载——你修改本地源码后,容器内的文件会同步更新,不用重新构建镜像,方便开发调试。
  • 而直接用Windows CMD执行docker build或docker-compose up --build时,只会严格按照你手写的Dockerfile和docker-compose.yml执行。你的Dockerfile在final阶段只复制了发布后的输出文件到/app,镜像里自然不会包含/src目录和源码。

简单来说:VS在开发模式下自动添加了本地目录挂载,导致容器内出现本地源码文件;纯命令行构建则完全遵循你的配置生成生产镜像,仅保留发布产物。

内容的提问来源于stack exchange,提问作者Farhan stands with Palestine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:25:48