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

Docker容器内C#运行dotnet CLI命令找不到dotnet.exe如何解决

报错核心原因
  • 你使用的多阶段构建Dockerfile最终运行阶段基于mcr.microsoft.com/dotnet/aspnet:6.0镜像,这是**.NET运行时专用镜像**,仅包含运行已编译.NET程序的最小依赖,没有打包完整.NET SDK工具链,不存在支持dotnet new脚手架命令的完整dotnet可执行程序,因此抛出找不到文件的错误。
  • C#启动进程的配置缺省参数,容器环境下未显式关闭shell执行、未指定dotnet绝对路径时,容易因为PATH环境变量未正确加载出现找不到可执行文件的问题。
修复方案

1. 调整Dockerfile配置

必须保证最终运行的容器内包含完整.NET SDK,直接将最终阶段的基础镜像替换为SDK镜像即可,同时给工作目录开放写入权限,保证脚手架命令可以正常创建项目文件。修正后的Dockerfile如下:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS final
WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY --from=publish /app/publish .
RUN chmod -R 777 /app
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

2. 修正C#进程启动代码

Linux容器内dotnet可执行文件的默认绝对路径为/usr/share/dotnet/dotnet,显式指定该路径,同时关闭shell执行、显式指定工作目录,避免环境变量带来的路径识别问题。修正后的代码如下:

var process = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = "/usr/share/dotnet/dotnet",
        Arguments = "new webapi -n WebApi",
        WorkingDirectory = "/app",
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        UseShellExecute = false
    }
};

process.Start();
// 读取命令执行输出和错误信息,方便排查问题
var output = process.StandardOutput.ReadToEnd();
var error = process.StandardError.ReadToEnd();
process.WaitForExit();

若使用Windows容器,dotnet可执行文件默认路径为C:\Program Files\dotnet\dotnet.exe,替换代码中FileName的值即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:57:21