首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在docker中导入时,eventlet引发错误

在docker中导入时,eventlet引发错误
EN

Stack Overflow用户
提问于 2021-10-06 22:23:23
回答 1查看 360关注 0票数 0

我今天和多克有些奇怪的问题。我描述了一个问题@ pathlib: cannot import name 'Sequence' from 'collections'。我并不是真的需要一个导致崩溃的包,所以我把它拿出来了。请注意,此问题仅在docker中发生。

删除artifactory包依赖项后,docker上的安装成功通过,但在导入时,我在flask应用程序初始化文件中遇到了TypeError:from flask_socketio import SocketIO, emit,这需要eventlet,这就是错误的来源:

代码语言:javascript
运行
复制
web_1  |     from eventlet import greenio
web_1  |   File "/usr/local/lib/python3.10/site-packages/eventlet/greenio/__init__.py", line 3, in <module>
web_1  |     from eventlet.greenio.base import *  # noqa
web_1  |   File "/usr/local/lib/python3.10/site-packages/eventlet/greenio/base.py", line 32, in <module>
web_1  |     socket_timeout = eventlet.timeout.wrap_is_timeout(socket.timeout)
web_1  |   File "/usr/local/lib/python3.10/site-packages/eventlet/timeout.py", line 166, in wrap_is_timeout
web_1  |     base.is_timeout = property(lambda _: True)
web_1  | TypeError: cannot set 'is_timeout' attribute of immutable type 'TimeoutError'
web_1  | ]

requirements.txt:

代码语言:javascript
运行
复制
alembic==1.7.3
aniso8601==8.0.0
appdirs==1.4.4
attrs==20.3.0
bcrypt==3.2.0
beautifulsoup4==4.9.3
bidict==0.21.3
blinker==1.4
boto3==1.18.50
botocore==1.21.50
bs4==0.0.1
cachelib==0.3.0
certifi==2020.12.5
cffi==1.14.5
chardet==3.0.4
click==8.0.1
cryptography==3.4.6
distlib==0.3.2
dnspython==1.16.0
dominate==2.6.0
email-validator==1.1.3
et-xmlfile==1.1.0
eventlet==0.30.2
filelock==3.0.12
Flask==2.0.1
Flask-Bootstrap==3.3.7.1
Flask-Login==0.5.0
Flask-Mail==0.9.1
flask-marshmallow==0.14.0
Flask-Migrate==3.1.0
Flask-RESTful==0.3.8
Flask-Session==0.4.0
Flask-SocketIO==5.1.1
Flask-SQLAlchemy==2.5.1
Flask-User==1.0.2.2
Flask-WTF==0.15.1
greenlet==1.1.0
gunicorn==20.1.0
idna==2.10
iniconfig==1.1.1
is-safe-url==1.0
itsdangerous==2.0.1
Jinja2==3.0.1
jmespath==0.10.0
Mako==1.1.5
MarkupSafe==2.0.1
marshmallow==3.12.2
marshmallow-sqlalchemy==0.26.1
openpyxl==3.0.7
packaging==20.9
paramiko==2.7.2
passlib==1.7.4
pexpect==4.8.0
pluggy==0.13.1
psycopg2-binary==2.9.1
ptyprocess==0.7.0
py==1.10.0
pycparser==2.20
PyNaCl==1.4.0
pyparsing==2.4.7
pytest==6.2.3
python-dateutil==2.8.1
python-dotenv==0.19.0
python-engineio==4.2.1
python-socketio==5.4.0
pytz==2021.1
requests==2.24.0
s3transfer==0.5.0
scp==0.13.3
shippo==2.0.2
simplejson==3.17.2
six==1.15.0
soupsieve==2.2
SQLAlchemy==1.4.15
SQLAlchemy-Utils==0.37.8
toml==0.10.2
urllib3==1.25.11
virtualenv==20.4.7
visitor==0.1.3
Werkzeug==2.0.1
WTForms==2.3.3
XlsxWriter==1.4.3

因此,当使用docker运行时,它会失败,并显示上述错误。我的入口点如下所示:

代码语言:javascript
运行
复制
flask db init
flask db migrate
flask db upgrade
gunicorn "main:create_app()" --workers 1 --threads 10 --bind=0.0.0.0:5010 --worker-class eventlet

但是,如果在本地运行相同的gunicorn命令,则应用程序启动时没有任何问题。

更新:我想尝试一个更具重现性的例子,并将其范围缩小: app.py:

代码语言:javascript
运行
复制
from flask import Flask
import flask_socketio

app = Flask(__name__)

def create_app():
    return app

requirements.txt:

代码语言:javascript
运行
复制
bidict==0.21.3
click==8.0.1
dnspython==2.1.0
eventlet==0.32.0
Flask==2.0.2
Flask-SocketIO==5.1.1
greenlet==1.1.2
gunicorn==20.1.0
itsdangerous==2.0.1
Jinja2==3.0.2
MarkupSafe==2.0.1
python-engineio==4.2.1
python-socketio==5.4.0
six==1.16.0
Werkzeug==2.0.2

Dockerfile:

代码语言:javascript
运行
复制
FROM python:3

WORKDIR /usr/src/app

COPY . .

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

EXPOSE 8000

CMD ["gunicorn", "-b", "0.0.0.0:8000", "app:create_app()", "--worker-class", "eventlet"]

使用docker build/docker run -it --publish 8888:8000 image_name执行。

并得到相同的错误。如果从需求中删除了eventlet,则不会出现错误。

我做错了什么吗?我只想用eventlet运行flask-socketio

EN

Stack Overflow用户

回答已采纳

发布于 2021-10-07 02:29:07

搜索异常,会导致相应的eventlet问题:https://github.com/eventlet/eventlet/issues/687

总结说,eventlet (0.32.0)目前与Python 3.10不兼容,因为它试图修补在Python 3.10中变得不可变的类型。

就像你的需求一样,更具体地描述你的Docker依赖也是一个很好的实践。现在,使用Python Docker image的标记3会得到3.10.0,除非它使用缓存。在未来,它可能是一个不同的版本。由于Python3.10存在兼容性问题,请使用Python3.9--目前最新的Python3.9Docker标签是3.9.7

例如,一旦您将Dockerfile的第一行更改为:

代码语言:javascript
运行
复制
FROM python:3.9.7
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69473317

复制
相关文章

相似问题

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