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

使用kubectl debug运行Python脚本时遭遇nerdctl命令未找到错误

问题排查与解决方案

问题核心原因

问题出在环境变量PATH未被正确加载:

  • 你在Dockerfile中将~/.local/bin添加到了~/.bashrc,但~/.bashrc仅在交互式bash shell(比如手动进入容器打开的bash)启动时才会自动执行。
  • 而kubectl debug直接运行python3 run_script.py时,bash是以非交互式非登录模式启动的,不会加载~/.bashrc,导致nerdctl所在的路径未被加入系统PATH,最终出现"command not found"错误。
  • 另外,Dockerfile中的RUN source ~/.bashrc完全无效——每个RUN指令都是独立的shell进程,执行完后环境变量不会保留到后续镜像层或容器运行时。

可行解决方案

以下三种方案任选其一即可:

方案1:将nerdctl安装到系统默认PATH目录

修改Dockerfile,把nerdctl放到系统默认包含的PATH目录(如/usr/local/bin),彻底规避环境变量问题:

FROM ubuntu:latest
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
LABEL version="0.1.0"

RUN apt-get -y update
RUN apt-get install wget curl  -y
RUN wget -q "https://github.com/containerd/nerdctl/releases/download/v1.0.0/nerdctl-full-1.0.0-linux-amd64.tar.gz" -O /tmp/nerdctl.tar.gz
# 改用系统全局目录,无需修改PATH
RUN mkdir -p /usr/local/bin
RUN tar -C /usr/local/bin/ -xzf /tmp/nerdctl.tar.gz --strip-components 1 bin/nerdctl

方案2:在Python脚本中使用nerdctl的绝对路径

直接在subprocess命令里指定nerdctl的完整路径,跳过PATH查找:

res = subprocess.run(
    f"/root/.local/bin/nerdctl --host '/host/run/containerd/containerd.sock' --namespace k8s.io commit {container} {image}",
    shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, executable='/bin/bash')

方案3:在命令中显式加载bashrc

如果必须保留~/.local/bin的路径,可以在执行nerdctl前手动加载~/.bashrc:

res = subprocess.run(
    f"source ~/.bashrc && nerdctl --host '/host/run/containerd/containerd.sock' --namespace k8s.io commit {container} {image}",
    shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, executable='/bin/bash')

额外优化建议

  • 删除Dockerfile中无效的RUN source ~/.bashrc指令。
  • 容器内尽量使用系统标准目录存放可执行文件,减少环境变量相关的调试成本。

内容的提问来源于stack exchange,提问作者Anil Kumar H P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:55:36