Docker中Python单元测试执行失败问题排查
Docker run执行Python单元测试找不到模块的原因分析
核心原因:工作目录与Python模块搜索路径不匹配
你遇到的问题本质是Docker容器执行命令时的工作目录和你手动进入容器后的工作目录不一致,导致Python无法找到测试模块:
- 你的Dockerfile只把lambda目录复制到了
/app,但没有设置WORKDIR /app,所以docker run默认的工作目录是容器根目录/。直接执行python -m unittest *_test.py时,Python会在/目录下查找测试文件,自然找不到存放在/app里的*_test.py。 - 当你手动进入容器后,大概率会切换到
/app目录执行命令,此时Python会把当前目录(/app)加入模块搜索路径sys.path,所以能正常找到并运行测试用例。
为什么改用discover命令可以正常执行?
unittest discover本身是用来自动搜索测试文件的命令,你能成功执行的原因大概率是这两种情况之一:
- 你在
discover命令里指定了测试文件所在的目录,比如python -m unittest discover -s /app,直接告诉命令去/app下找测试文件; - 你在
docker run时通过-w /app参数指定了工作目录,此时discover默认在当前工作目录(/app)下递归搜索测试文件,自然能找到。
验证与解决方法
如果想让原来的python -m unittest *_test.py命令直接生效,只需在docker run时指定工作目录:
docker run -w /app <你的镜像名> python -m unittest *_test.py
或者在Dockerfile里添加一行:
WORKDIR /app
这样后续docker run执行命令时,默认工作目录就是/app,无需额外参数就能找到测试模块。
内容的提问来源于stack exchange,提问作者Eduardo Rodrigues
相关产品推荐
相关产品推荐

