一、你遇到的问题本质是什么你遇到的不是一个 bug而是三件事叠加① Docker 启动机制② Linux shell 初始化机制③ Ascend NPU 环境依赖机制最终表现为同一个镜像不同启动方式 → 环境变量不一致 → Paddle NPU 初始化失败二、Docker 核心机制必须搞清2.1 ENTRYPOINT vs CMD核心✔ ENTRYPOINT容器“主程序”ENTRYPOINT [sh, gunicorn.sh]含义容器启动 永远执行这个程序✔ CMD默认参数CMD [--port8017]或docker run image arg1 arg2 会替换 CMD2.2 最终执行规则非常重要最终执行 ENTRYPOINT CMD例如ENTRYPOINT [bash, -c] CMD [echo hello]最终bash -c echo hello2.3 docker run 参数不会改 ENTRYPOINT例如docker run image /bin/bash -c echo 1真实行为ENTRYPOINT CMD 拼接 不会“启动第二个 shell”三、docker run 三个关键参数你问的重点3.1 -it交互模式docker run -it image等价于-i保持 STDIN 打开 -t分配伪终端✔ 作用让你能“像 SSH 一样进入容器”可以交互输入命令CtrlC / CtrlZ 可用❌ 不加 -itdocker run image特点直接执行命令没有交互界面stdout/stderr 为主3.2 -d后台运行docker run -d image✔ 作用容器在后台运行对比模式行为-it前台交互-d后台运行⚠️ 重要区别docker run -it image你会看到 logdocker run -d image你看不到 log需要docker logs -f container3.3 --rm自动删除docker run --rm image✔ 作用容器退出后自动删除行为对比是否加 --rm容器状态有退出即删除无Exited 状态保留⚠️ 工程影响很关键加了 --rm报错 → 容器消失 → 无法排查不加报错 → 容器保留 → 可 inspect / logs / exec四、shell 初始化机制你问题核心4.1 bash -llogin shellbash -lc cmd会加载/etc/profile ~/.bash_profile ~/.bashrc✔ 结果环境变量完整ASCEND_HOME_PATHLD_LIBRARY_PATHPATHPYTHONPATH4.2 sh非 login shellsh gunicorn.sh特点不读 profile不读 bashrc❌ 结果环境“裸的”→ Paddle NPU 初始化失败五、你真实问题链路关键✔ 成功路径docker run --entrypoint /bin/bash -lc → login shell → profile / bashrc → Ascend set_env.sh → LD_LIBRARY_PATH 正确 → Paddle NPU OK❌ 失败路径ENTRYPOINT sh gunicorn.sh → non-login shell → 无初始化 → libmsprofiler.so 找不到 → Paddle NPU crash六、为什么错误是 libmsprofiler.so表面cannot open libmsprofiler.so本质 LD_LIBRARY_PATH 不完整缺/usr/local/Ascend/ascend-toolkit/latest/lib64七、docker inspect 为什么重要你用过docker inspect它能看到ENTRYPOINTCMDENVWORKDIR关键点--entrypoint /bin/bash 会覆盖 Dockerfile ENTRYPOINT八、-lc 到底干了什么bash -lc cmd等价-l login shell -c 执行命令关键副作用 触发环境初始化链路九、你这个问题的“本质模型”可以总结成 模型Docker 执行器 Shell 环境初始化器 Ascend 强依赖环境变量系统❗问题本质Docker 没问题Paddle 没问题Ascend 没问题 是“shell 初始化路径不一致”十、工业级最佳实践重点❌ 不推荐隐式依赖~/.bashrc/etc/profilebash -ldocker -it 才能跑✅ 推荐方案工程标准方案1最稳 在业务脚本里显式初始化source /usr/local/Ascend/ascend-toolkit/latest/set_env.sh方案2Docker标准ENTRYPOINT [sh, gunicorn.sh]方案3生产级gunicorn.sh: 1. 初始化 Ascend env 2. 设置 LD_LIBRARY_PATH 3. 启动服务十一、标准启动对比图博客重点✔ 推荐流程docker run ↓ gunicorn.sh ↓ source set_env.sh ↓ 启动服务❌ 不稳定流程docker run ↓ bash -l依赖环境 ↓ profile 自动加载 ↓ 偶尔成功 / 偶尔失败十二、一句话终极总结Docker 只负责执行入口真正决定环境是否正确的是 shell 初始化方式而 Ascend NPU 强依赖 profile/basrc 中的环境变量配置因此 login shell 与 non-login shell 的差异会直接导致运行结果完全不同。