如何将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
相关产品推荐
相关产品推荐

