如何在基于Python镜像的Docker容器中安装.NET CLI
解决Docker容器中.NET CLI安装及dotnet命令未识别问题
一、核心问题定位
你遇到的[Errno 2] No such file or directory错误,本质是容器内未安装.NET CLI,导致系统无法识别dotnet命令;同时subprocess.call的调用方式有误,将整个命令串当作单个文件路径处理。
二、在Dockerfile中正确安装.NET CLI
以Python官方镜像(如python:3.10-slim)为例,添加以下步骤完成.NET CLI安装:
1. 安装系统依赖
先部署.NET运行所需的基础依赖:
RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ libc6 \ libgcc1 \ libgssapi-krb5-2 \ libicu72 \ libssl3 \ libstdc++6 \ zlib1g \ && rm -rf /var/lib/apt/lists/*
2. 安装.NET SDK(适配dotnet test场景)
dotnet test需要完整的SDK支持,以下是.NET 7 SDK的安装步骤(可根据需求更换版本):
# 指定.NET SDK版本 ENV DOTNET_VERSION=7.0.400 # 下载并解压安装SDK RUN curl -SL --output dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Sdk/$DOTNET_VERSION/dotnet-sdk-$DOTNET_VERSION-linux-x64.tar.gz \ && mkdir -p /usr/share/dotnet \ && tar -zxf dotnet.tar.gz -C /usr/share/dotnet \ && rm dotnet.tar.gz \ && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet
3. 验证安装(可选)
添加命令确认.NET CLI安装成功:
RUN dotnet --version
三、修正subprocess调用方式
原代码将整个命令作为单个字符串传入,导致系统误判为文件路径。正确写法需拆分命令参数:
import subprocess # 拆分命令为列表形式(推荐,避免shell注入风险) command = [ "dotnet", "test", "././student-repos/oefeningen_oop-CoolsBrent-1690206525.848589/01/01_01/test", "-l:trx;LogFileName=result.xml", "--verbosity=quiet" ] # 执行命令,check=True可在命令失败时抛出异常 subprocess.call(command, check=True)
若必须使用字符串形式调用,需添加shell=True(不推荐,存在安全风险):
subprocess.call('dotnet test ././student-repos/oefeningen_oop-CoolsBrent-1690206525.848589/01/01_01/test -l:"trx;LogFileName=result.xml" --verbosity="quiet"', shell=True)
四、完整Dockerfile示例
FROM python:3.10-slim # 安装系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ libc6 \ libgcc1 \ libgssapi-krb5-2 \ libicu72 \ libssl3 \ libstdc++6 \ zlib1g \ && rm -rf /var/lib/apt/lists/* # 安装.NET 7 SDK ENV DOTNET_VERSION=7.0.400 RUN curl -SL --output dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Sdk/$DOTNET_VERSION/dotnet-sdk-$DOTNET_VERSION-linux-x64.tar.gz \ && mkdir -p /usr/share/dotnet \ && tar -zxf dotnet.tar.gz -C /usr/share/dotnet \ && rm dotnet.tar.gz \ && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet # 验证.NET安装 RUN dotnet --version # 设置工作目录 WORKDIR /app # 安装Python依赖 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 启动应用(根据你的实际启动命令调整) CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
内容的提问来源于stack exchange,提问作者Joren97
相关产品推荐
相关产品推荐

