我今天和多克有些奇怪的问题。我描述了一个问题@ pathlib: cannot import name 'Sequence' from 'collections'。我并不是真的需要一个导致崩溃的包,所以我把它拿出来了。请注意,此问题仅在docker中发生。
删除artifactory包依赖项后,docker上的安装成功通过,但在导入时,我在flask应用程序初始化文件中遇到了TypeError:from flask_socketio import SocketIO, emit
,这需要eventlet,这就是错误的来源:
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:
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运行时,它会失败,并显示上述错误。我的入口点如下所示:
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:
from flask import Flask
import flask_socketio
app = Flask(__name__)
def create_app():
return app
requirements.txt:
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:
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
发布于 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
的第一行更改为:
FROM python:3.9.7
https://stackoverflow.com/questions/69473317
复制相似问题