You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI Docker镜像构建及oracledb运行libaio依赖问题求助

解决FastAPI Docker镜像构建与Oracle客户端依赖问题

问题描述

原Dockerfile

FROM python:3.12-slim
# Oralce dep
WORKDIR /opt/oracle
RUN apt-get update && apt-get install -y iputils-ping wget unzip libaio1
RUN wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip && \
    unzip instantclient-basiclite-linuxx64.zip && rm -f instantclient-basiclite-linuxx64.zip && \
    cd /opt/oracle/instantclient* && rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci && \
    echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig
RUN python -m pip install oracledb
# FastAPI
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
COPY ./app /code/app
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
RUN mkdir /code/logs
CMD ["python3", "./app/main.py"]
HEALTHCHECK --interval=60s --timeout=5s --retries=5 CMD wget --no-verbose -O /dev/null http://127.0.0.1:8080/latest/health || exit 1

构建错误

近期重新构建时出现包找不到错误:

#7 1.773 Reading package lists...
#7 2.338 Reading package lists...
#7 2.892 Building dependency tree...
#7 3.031 Reading state information...
#7 3.050 E: Unable to locate package libaio1
#7 ERROR: process "/bin/sh -c apt-get update && apt-get install -y iputils-ping wget unzip libaio1" did not complete successfully: exit code: 100

替换后的运行错误

将libaio1替换为libaio1t64后构建成功,但运行时触发Oracle客户端库找不到错误:

File "/code/app/modules/database/databaseModel.py", line 7, in <module>
    oracledb.init_oracle_client()
  File "src/oracledb/impl/thick/utils.pyx", line 527, in oracledb.thick_impl.init_oracle_client
  File "src/oracledb/impl/thick/utils.pyx", line 562, in oracledb.thick_impl.init_oracle_client
  File "src/oracledb/impl/thick/utils.pyx", line 474, in oracledb.thick_impl._raise_from_info
oracledb.exceptions.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libaio.so.1: cannot open shared object file: No such file or directory". See https://python-oracledb.readthedocs.io/en/latest/user_guide/initialization.html for help
Help: https://python-oracledb.readthedocs.io/en/latest/user_guide/troubleshooting.html#dpi-1047

解决方案

方案1:修复libaio库软链接(兼容厚模式)

Debian 12(Bookworm)中libaio1t64提供的库文件名为libaio.so.1t64,而oracledb厚模式需要libaio.so.1,因此需要创建软链接映射:

修改Dockerfile中Oracle依赖安装部分:

FROM python:3.12-slim
# Oralce dep
WORKDIR /opt/oracle
RUN apt-get update && apt-get install -y iputils-ping wget unzip libaio1t64 && \
    # 创建软链接匹配oracledb所需的库文件名
    ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so.1
RUN wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip && \
    unzip instantclient-basiclite-linuxx64.zip && rm -f instantclient-basiclite-linuxx64.zip && \
    cd /opt/oracle/instantclient* && rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci && \
    echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig
RUN python -m pip install oracledb
# FastAPI
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
COPY ./app /code/app
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
RUN mkdir /code/logs
CMD ["python3", "./app/main.py"]
HEALTHCHECK --interval=60s --timeout=5s --retries=5 CMD wget --no-verbose -O /dev/null http://127.0.0.1:8080/latest/health || exit 1

方案2:改用oracledb Thin模式(推荐,简化镜像)

oracledb默认支持Thin模式,无需安装Oracle Instant Client库,只需修改代码并简化Dockerfile:

  1. 修改Python代码:删除oracledb.init_oracle_client()调用,确保连接字符串使用易连接格式(如user/password@host:port/service_name)。

  2. 简化后的Dockerfile:

FROM python:3.12-slim
# FastAPI
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
COPY ./app /code/app
RUN apt-get update && apt-get install -y iputils-ping wget && \
    pip install --no-cache-dir --upgrade -r /code/requirements.txt && \
    apt-get purge -y --auto-remove wget && \
    rm -rf /var/lib/apt/lists/*
RUN mkdir /code/logs
CMD ["python3", "./app/main.py"]
HEALTHCHECK --interval=60s --timeout=5s --retries=5 CMD wget --no-verbose -O /dev/null http://127.0.0.1:8080/latest/health || exit 1

Thin模式不仅减少了镜像体积,还避免了Oracle客户端库的依赖问题,是更简洁的解决方案。


内容的提问来源于stack exchange,提问作者BeRightBack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 11:14:49