模块导入仅在 docker 中失败

T.P*_*Poe 5 python python-import python-2.7 docker

我在 Flask 应用程序中使用第三方包。当我在 Flask 应用程序和 docker 之外测试这些包时,它们工作得很好。当我将它们包含在应用程序中时,在构建并运行 docker 后,它在某些导入上失败。我不知道该怎么做才能正确导入模块。

这是项目的结构:

flask_app
??? Dockerfile
??? canetis
|   ??? install.sh
|   ??? __init__.py
|   ??? align.py
|   ??? utils.py
|   ??? gentle
|       ??? install.sh
|       ??? gentle
|           ??? __init__.py
|           ??? resources.py
|           ??? util
|               ??? __init__.py
|               ??? paths.py
|       ??? ext
|           ??? kaldi
|               ??? install.sh
Run Code Online (Sandbox Code Playgroud)

gentle包是从canetis/install.sh脚本中的git 克隆的。

使用的dockerfile:

FROM python:2.7

RUN rm /bin/sh && ln -s /bin/bash /bin/sh

WORKDIR /app

RUN apt-get update
RUN pip install --upgrade pip

RUN apt-get update && \
      apt-get -y install sudo

ADD ./requirements.txt ./requirements.txt
RUN pip install -r requirements.txt

ADD . /app

RUN cd ./canetis && ./install.sh && source ~/.bashrc

ENV WEB_CONCURRENCY 5

CMD gunicorn app:app
Run Code Online (Sandbox Code Playgroud)

构建 docker 时,如果失败并显示此错误:

| Traceback (most recent call last):
|   File "/usr/local/lib/python2.7/runpy.py", line 174, in _run_module_as_main
|     "__main__", fname, loader, pkg_name)
|   File "/usr/local/lib/python2.7/runpy.py", line 72, in _run_code
|     exec code in run_globals
|   File "/app/app.py", line 3, in <module>
|     import tasks
|   File "tasks.py", line 3, in <module>
|     from canetis.align import align
|   File "canetis/align.py", line 3, in <module>
|     from utils import run_gentle
|   File "canetis/utils.py", line 2, in <module>
|     import gentle as gentle
|   File "/usr/local/lib/python2.7/site-packages/gentle/__init__.py", line 2, in <module>
|     from resources import Resources
|   File "/usr/local/lib/python2.7/site-packages/gentle/resources.py", line 4, in <module>
|     from util.paths import get_resource, ENV_VAR
| ImportError: No module named util.paths
Run Code Online (Sandbox Code Playgroud)

问题可能是温柔模块有一个名为温柔的子文件夹,所以python无法正确找到它?但是为什么它可以在 docker 之外工作呢?任何帮助表示赞赏。