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

如何将Docker容器中发布的自包含.NET项目保存到宿主机?

问题描述

我需要在Docker中发布自包含的.NET应用,并将发布产物保存到本地电脑。尝试用docker run --rm -v myHostFolderPath:/app/artifact myimage:latest命令通过-v参数挂载卷,但没生效。进入容器的/bin/sh后,确认artifact文件夹里有已发布的项目,但容器运行后本地电脑并没有保存文件。

给出的Dockerfile内容如下:

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["folder1/folder2/MyProject.csproj", "MyProject/"]
COPY ["folder3/folder4/MyLib.csproj", "MyLib/"]
WORKDIR "MyProject/MyProject.Api/"
CMD dotnet build "MyProject.csproj" -c Release -o /app/build


FROM build AS publish
CMD dotnet publish "MyProject.csproj" -o artifacts
问题根源与修复方案

1. Dockerfile指令与路径问题

  • 你用了CMD指令定义构建/发布命令,但CMD是容器启动时才执行的指令,多阶段构建中,build阶段的CMD完全没必要,而且publish阶段的发布路径是相对路径artifacts,和你挂载的/app/artifact目录路径、名称都不匹配。
  • 缺少依赖还原步骤,直接构建大概率会失败。

2. 挂载路径要求

Docker挂载本地目录必须用绝对路径,相对路径不生效,这也是本地没收到文件的常见原因之一。

修复后的Dockerfile

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["folder1/folder2/MyProject.csproj", "MyProject/"]
COPY ["folder3/folder4/MyLib.csproj", "MyLib/"]
# 还原项目依赖
RUN dotnet restore "MyProject/MyProject.Api/MyProject.csproj"
# 复制所有项目文件
COPY . .
WORKDIR "/src/MyProject/MyProject.Api/"
# 编译项目到临时目录
RUN dotnet build "MyProject.csproj" -c Release -o /app/build

FROM build AS publish
# 发布到挂载的目标目录,同时指定自包含模式和运行时
RUN dotnet publish "MyProject.csproj" -c Release -o /app/artifact --self-contained true --runtime linux-x64
# 容器启动时可验证发布目录内容,也可留空
CMD ["ls", "/app/artifact"]

3. 正确的运行命令

把myHostFolderPath替换成本地的绝对路径(比如Linux的/home/user/my-dotnet-artifacts,Windows的C:\dotnet-publish-files),然后执行:

docker run --rm -v /本地绝对路径:/app/artifact myimage:latest

关键注意事项

  • 不需要的base阶段可以直接删除,因为整个流程用sdk镜像就能完成构建和发布。
  • --self-contained true必须加上,同时要指定对应运行时(比如win-x64、linux-arm64,根据你的部署需求调整)。
  • 确保本地挂载目录有读写权限,避免因权限问题导致文件无法写入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:35:16