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:
修改Python代码:删除
oracledb.init_oracle_client()调用,确保连接字符串使用易连接格式(如user/password@host:port/service_name)。简化后的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
相关产品推荐
相关产品推荐

