说下背景,python web项目,在本地 IDE执行正常,然后CI/CD编译打镜像,在K8S中想要把项目docker容器拉起来,报错:

[root@SY613596 ~]# kubectl -n easyreport logs -f wasp-api-674fd9d84b-g7f2q
Traceback (most recent call last):
File "/app/wasp/main.py", line 3, in <module>
from wasp.logger import logger
ModuleNotFoundError: No module named 'wasp'

这个wasp是我的app名字,即项目名称,找不到,首先我想到的就是路径问题,因为这个问题之前遇到过类似的,见我另外一篇文章:命令行执行.py文件通过flask-script初始化数据库提示ModuleNotFoundError: No module named ‘XXX’ 解决方法

那次是自己主动在CMD中去执行一个单独的py文件,与主程序基本独立的,原因就在于在ide中执行python程序,都已经在默认的项目路径中,所以直接执行是没有问题的。但是在cmd中执行程序,所在路径是python的搜索路径,如果涉及到import引用就会报类似ImportError: No module named xxx这样的错误,解决方法:
在报错的模块中添加:
import sys
import os
curPath = os.path.abspath(os.path.dirname(file))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)

当时,这样就可以解决了。

这次的问题是在主程序main.py中居然就找不到,那我配置的路径去哪里了?!一脸懵逼
在k8s中的目录设置肯定是在dockerfile中声明的吖,赶紧去dockerfile中找设置目录的命令去,一查不要紧,原来声明语句在我一次清理dockerfile中的环境变量的时候被我不小心一并删除了,mlgb的心里狠狠的骂了自己一下!赶紧补上:

# /bin/dockerfile
ENV PYTHONPATH=/app

本质上这个坑和上次坑的原理是一致的,就是CMD下的路径需要主动去配置,而IDE中默认它已经帮你配好了(当然有些情况也还是要主动去配置下)

一个坑,摔了两次,囧~

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐