【发布时间】:2019-08-08 15:03:01
【问题描述】:
我有一个 Python3 Flask 应用程序,我想把它放到容器中。我已将 Flask 添加到 requirements.txt,它在本地工作,但在容器中找不到“flask”模块。我做错了什么?
requirements.txt:
aniso8601==7.0.0
certifi==2019.6.16
chardet==3.0.4
Click==7.0
Flask==1.1.1
Flask-RESTful==0.3.7
idna==2.8
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
pymongo==3.8.0
pytz==2019.1
requests==2.22.0
six==1.12.0
urllib3==1.25.3
Werkzeug==0.15.4
最少的工作app.py:
from flask import Flask
from flask_restful import Api
app = Flask(__name__)
api = Api(app)
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8080)
Dockerfile:
FROM python:3.7-alpine
WORKDIR /usr/src/app
RUN apk add --no-cache \
uwsgi-python3
COPY . .
ENV TESTING TRUE
RUN pip3 install --no-cache-dir -r requirements.txt
CMD [ "uwsgi", "--socket", "0.0.0.0:3031", \
"--uid", "uwsgi", \
"--plugins", "python3", \
"--protocol", "uwsgi", \
"--wsgi", "app:app", \
"-p", "4", \
"--enable-threads"]
错误:
*** Operational MODE: preforking ***
Traceback (most recent call last):
File "./app.py", line 5, in <module>
from flask import Flask, request, Response
ModuleNotFoundError: No module named 'flask'
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
Example of app.py(太大,无法添加到问题中)
项目结构:
├── app.py
├── docker-compose.yml
├── Dockerfile
├── LICENSE
├── logging_config.ini
├── nginx.conf
├── __pycache__
│ └── utils.cpython-37.pyc
├── README.md
├── requirements.txt
├── testing_data
│ ├─- some jsons here
├── tests.py
└── utils.py
【问题讨论】:
-
您是否介意在您的问题中也添加一个(非常)缩短的
app.py版本? -
如果您在标头中声明了 python:3.7,则不需要 pip3。尝试用 pip 替换 pip3。否则,请在此处复制您项目的文件结构。你有 .dockerignore 文件吗?
-
添加应用示例,更改 pip 版本没有区别,我没有 .dockerignore
-
您可以将示例应用程序减少到最低限度;这很容易适合问题,并使其更具可重复性。
-
为了它的价值:我可以重现你的错误。如果我可以在没有
CMD部分的情况下创建相同的图像并运行它(使用-ti和/bin/sh,我可以运行python3 app.py。如果我改为运行uwsgi --protocol uwsgi --plugins python3 -s 0.0.0.0:3031 --wsgi app:app,我会回到ModuleNotFoundErro再次。