Docker本地运行正常,发布后遇到ODBC问题
出现问题的时候是通过docker在阿里云流水线发布,一直报flask启动错误,最后无奈,把源码的环境整个清空,重新搭建解释器
然后开始本身一切正常,直到遇到报错:
Traceback (most recent call last):
File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 1473, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 882, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 880, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 865, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/running/python/src/app/routes.py", line 19, in wingwell
results = run_recommendation(doctorid)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/running/python/src/app/recommandation.py", line 19, in run_recommendation
result = evaluate.evaluate_model(doctorid, model_name='xgboost') # 进行冷启动推荐
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/running/python/model/CS_Eva.py", line 21, in evaluate_model
data_for_eval = self.final_deal.final_data_merge(is_eval=True, doctor_id=doctorid)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/running/python/src/clean_process/cs_clean.py", line 173, in final_data_merge
data_query = DatabaseQuery() # 实例化数据库查询类
^^^^^^^^^^^^^^^
File "/running/python/src/database/data_acquisition.py", line 72, in __init__
super().__init__(sql_directory=sql_directory, server=server, port=port,
File "/running/python/src/database/data_acquisition.py", line 43, in __init__
self.engine = create_engine(f"mssql+pyodbc:///?odbc_connect={encoded_connection_string}")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<string>", line 2, in create_engine
File "/usr/local/lib/python3.11/site-packages/sqlalchemy/util/deprecations.py", line 281, in warned
return fn(*args, **kwargs) # type: ignore[no-any-return]
^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/sqlalchemy/engine/create.py", line 599, in create_engine
dbapi = dbapi_meth(**dbapi_args)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/sqlalchemy/connectors/pyodbc.py", line 60, in import_dbapi
return __import__("pyodbc")
^^^^^^^^^^^^^^^^^^^^
ImportError: libodbc.so.2: cannot open shared object file: No such file or directory
172.17.0.1 - - [03/Sep/2024 18:33:44] "GET /Recalgo HTTP/1.1" 500 -
问GPT:解释是python解释器缺少ODBC驱动,然后就开始陷入死循环,要么是下载太慢,要么是驱动安装错误
这里有几个注意事项:
1、注意自己python的docker是在什么上面跑的,有两个 一个是Ubuntu,另外一个是Alphine
2、其次注意自己的网络来源,走阿里云发布会非常卡…
最后把Docker附上
FROM 这里用自己公司的python镜像。
# 设置时区
ENV TZ=Asia/Shanghai
# 手动创建sources.list并设置为阿里云的镜像源
RUN echo "deb http://mirrors.aliyun.com/debian/ bookworm main non-free contrib" > /etc/apt/sources.list \
&& echo "deb-src http://mirrors.aliyun.com/debian/ bookworm main non-free contrib" >> /etc/apt/sources.list
# 更新软件包列表并安装依赖
RUN apt-get update && apt-get install -y unixodbc-dev gnupg2 curl
# 添加 Microsoft 的官方包源
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
&& curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
# 安装 SQL Server ODBC Driver
RUN apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql18
# 将requirements.txt复制到容器的当前工作目录
COPY requirements.txt ./
# 使用清华大学镜像源安装requirements.txt中指定的所有依赖包
RUN pip install --no-cache-dir -r requirements.txt --index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 将项目的根目录复制到容器的/running/python目录下
COPY . /running/python
# 设置工作目录
WORKDIR /running/python
# 暴露端口8,这样外部可以访问 Flask 应用
EXPOSE 8
# 设置环境变量以指定 Flask 应用
ENV FLASK_APP=main.py
ENV FLASK_ENV=production
ENV FLASK_DEBUG=0
ENV FLASK_RUN_HOST=0.0.0.0
ENV FLASK_RUN_PORT=8
# 容器启动时运行应用
CMD ["flask", "run"]