首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Docker中运行应用程序时的ModuleNotFound

在Docker中运行应用程序时的ModuleNotFound
EN

Stack Overflow用户
提问于 2019-08-08 23:03:02
回答 3查看 695关注 0票数 1

我有一个Python3 Flask应用程序,我想把它放到容器中。我已经在requirements.txt中添加了Flask,它可以在本地工作,但在容器中找不到"flask“模块。我做错了什么?

requirements.txt:

代码语言:javascript
复制
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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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"]

错误:

代码语言:javascript
复制
*** 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 ***

app.py的Example (太大,无法添加到问题中)

项目结构:

代码语言:javascript
复制
├── 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
EN

回答 3

Stack Overflow用户

发布于 2019-08-08 23:18:03

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

类似于:

代码语言:javascript
复制
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"]```
票数 1
EN

Stack Overflow用户

发布于 2019-08-08 23:26:31

我已经尝试复制这个错误(没有运气),但您可能仍然会发现这一点很有用。如果您可以使用app.py第1-5行编辑您的问题,我也许可以复制它并更新我的答案。

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

代码语言:javascript
复制
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"]

重建镜像

代码语言:javascript
复制
$ docker build . -t soflask

将容器作为守护进程运行

代码语言:javascript
复制
$ 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行是什么样子?

票数 1
EN

Stack Overflow用户

发布于 2019-08-09 19:40:49

好吧,运行Python :3.10会有所帮助,但是因为它目前是随Python3.6一起提供的(我需要3.7),所以我以这样一个Dockerfile结束:

代码语言:javascript
复制
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 --no-cache python3...魔法是从here那里夺走的。不知道是怎么回事,但就是行得通。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57415618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档