Python 在Docker中运行应用程序时ModuleNotFound

Python 在Docker中运行应用程序时ModuleNotFound,python,docker,flask,Python,Docker,Flask,我有一个Python3烧瓶应用程序,我想把它放到容器里。我已经将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 M

我有一个Python3烧瓶应用程序,我想把它放到容器里。我已经将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"]
FROM alpine:3.10
VOLUME /usr/src/app/public
WORKDIR /usr/src/app
RUN apk add --no-cache python3 && \
    if [ ! -e /usr/bin/python ]; then ln -sf python3 /usr/bin/python ; fi && \
    python3 -m ensurepip && \
    rm -r /usr/lib/python*/ensurepip && \
    pip3 install --no-cache --upgrade pip setuptools wheel && \
    if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi
RUN apk add --no-cache \
        uwsgi-python3
COPY . .
RUN rm -rf public/*
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 ***

尝试使用pip而不是pip3,并尝试显式地将requirements.txt复制到Docker root。 您还需要在使用workdir之前创建一个workdir

比如:

FROM python:3.7-alpine

COPY requirements.txt /
RUN pip install --no-cache-dir -r requirements.txt

RUN mkdir /app
WORKDIR /app
COPY . app/

# not sure what this is doing
RUN apk add --no-cache \
        uwsgi-python3

# ENV TESTING TRUE

CMD [ "uwsgi", "--socket", "0.0.0.0:3031", \
               "--uid", "uwsgi", \
               "--plugins", "python3", \
               "--protocol", "uwsgi", \
               "--wsgi", "app:app", \
               "-p", "4", \
               "--enable-threads"]```
我试图复制错误(没有运气),但您可能仍然会发现这很有用。如果你可以用你的
app.py
第1-5行编辑你的问题,我也许可以复制它并更新我的答案

我已经修改了Dockerfile,添加了bash(第5行),这样您就可以进入容器并查看发生了什么-

FROM python:3.7-alpine
WORKDIR /usr/src/app
RUN apk add --no-cache \
        uwsgi-python3 \
        bash
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"]
重建图像

$ docker build . -t soflask
将容器作为守护进程运行

$ docker run -d --rm soflask
$ docker ps

CONTAINER ID ...
96f341e998d4 ...

$ docker exec -i -t 96f bash
$ python
>>> from flask import Flask
>>>

没有错误。。。app.py第1-5行是什么样子的?

好吧,运行alpine:3.10有帮助,但因为它目前与Python 3.6(我需要3.7)一起提供,所以我以这样一个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"]
FROM alpine:3.10
VOLUME /usr/src/app/public
WORKDIR /usr/src/app
RUN apk add --no-cache python3 && \
    if [ ! -e /usr/bin/python ]; then ln -sf python3 /usr/bin/python ; fi && \
    python3 -m ensurepip && \
    rm -r /usr/lib/python*/ensurepip && \
    pip3 install --no-cache --upgrade pip setuptools wheel && \
    if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi
RUN apk add --no-cache \
        uwsgi-python3
COPY . .
RUN rm -rf public/*
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"]

此运行apk add--无缓存python3。。。魔法被剥夺了。不知道如何,但它只是工作。

您介意在您的问题中添加一个(非常)简短的
app.py版本吗?如果您在标题中声明python:3.7,则不需要pip3。尝试用pip替换pip3。否则,请在此处复制项目的文件结构。你有一个.dockrignore文件吗?添加了应用程序示例,更改pip版本没有任何区别,我没有。dockrignore你可以将示例应用程序减少到最小;这将很容易符合问题的内容,并使其更具再现性。值得一提的是:我可以重现你的错误。如果我可以在没有
CMD
部分的情况下创建相同的图像并运行(使用
-ti
/bin/sh
,我可以运行
python3 app.py
。如果我运行
uwsgi--protocol uwsgi--plugins python3-s 0.0.0.0:3031--wsgi app:app
,我又回到了ModuleNotFoundErro。为这个问题添加了示例,但这里没有什么特别的地方仍然可以正常工作……我会尝试停止继续ainer(确保我停止了正确的容器),重新构建映像,然后重新运行容器。我唯一的想法是,可能您添加到Dockerfile中,而忘记了重建映像。好吧,我猛击到容器中,pip列表告诉我,我有所有需要的模块,因此它似乎是某种错误。我将使用另一个基本容器,因为它通常与alpine:3.10一起工作。不太可能答案,但工作正常workaround@biryulin04如果它确实适用于特定版本的Alpine,我肯定会注意到这是一个答案,即使它没有解释根本原因。其他搜索此问题的人也可能会找到您的解决方案。