为何通过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
相关产品推荐
相关产品推荐

