我有一个Python3 Flask应用程序,我想把它放到容器中。我已经在requirements.txt中添加了Flask,它可以在本地工作,但在容器中找不到"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 ***app.py的Example (太大,无法添加到问题中)
项目结构:
├── 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发布于 2019-08-08 23:18:03
尝试使用pip而不是pip3,并尝试将requirements.txt显式复制到Docker根目录。此外,您还需要在使用它之前创建一个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"]```发布于 2019-08-08 23:26:31
我已经尝试复制这个错误(没有运气),但您可能仍然会发现这一点很有用。如果您可以使用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行是什么样子?
发布于 2019-08-09 19:40:49
好吧,运行Python :3.10会有所帮助,但是因为它目前是随Python3.6一起提供的(我需要3.7),所以我以这样一个Dockerfile结束:
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那里夺走的。不知道是怎么回事,但就是行得通。
https://stackoverflow.com/questions/57415618
复制相似问题