Python通过Docker打包遇到ODBC错误

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"]



​
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值