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

R Docker镜像配置DBI/ODBC连接PostgreSQL时驱动找不到的问题

问题描述

自行构建了包含R、ODBC与DBI的Docker镜像anirbans96/rodbcdbi,尝试通过psqlodbcw.so驱动连接PostgreSQL时,尽管已将驱动文件从laudio/pyodbc:1.0.38镜像复制到镜像内/usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so路径且验证文件存在,但执行以下R连接代码时:

DBI::dbConnect(
    odbc::odbc(),
    Server=server,
    Database=database,
    UID=user,
    PWD=password
)

仍抛出错误:

nanodbc/nanodbc.coo:1118: 0000: [unixODBC][Driver Manager] Can't open lib '/usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so' : file not found

基础Dockerfile:

FROM rocker/r-ubuntu

RUN apt-get update -y && apt-get install -y build-essential curl gnupg2 software-properties-common dirmngr apt-transport-https apt-utils lsb-release ca-certificates
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get update -y
RUN ACCEPT_EULA=Y apt-get install -y msodbcsql17 unixodbc-dev mssql-tools 

# Install R packages (odbc R package must be installed AFTER installing ODBC in the OS)
RUN Rscript -e "install.packages('odbc')"
RUN Rscript -e "install.packages('DBI')"

# Copy and execute R script
# RUN mkdir /home/analysis
# COPY transformdata.r /home/analysis/transformdata.r
# CMD R -e "source('/home/analysis/transformdata.r')"

后续复制驱动的Dockerfile:

FROM anirbans96/rodbcdbi
RUN mdkir /usr/lib/x86_64-linux-gnu/odbc/
COPY psqlodbcw.so /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
解决方案

1. 修复Dockerfile拼写错误

第二个Dockerfile中mdkir是拼写错误,应改为mkdir,同时添加-p参数避免目录已存在时报错:

RUN mkdir -p /usr/lib/x86_64-linux-gnu/odbc/

2. 替换为兼容的官方驱动

复制的psqlodbcw.so是Windows版本命名,Linux环境下建议直接安装官方兼容的PostgreSQL ODBC驱动,替代手动复制的文件:

RUN apt-get update && apt-get install -y odbc-postgresql

该包会自动安装适配当前系统的psqlodbc.so驱动,并处理依赖问题。

3. 配置ODBC驱动注册表

unixODBC需要通过odbcinst.ini识别驱动,在Dockerfile中添加驱动配置:

RUN echo "[PostgreSQL]" >> /etc/odbcinst.ini \
    && echo "Driver=/usr/lib/x86_64-linux-gnu/odbc/psqlodbc.so" >> /etc/odbcinst.ini \
    && echo "Setup=/usr/lib/x86_64-linux-gnu/odbc/libodbcpsqlS.so" >> /etc/odbcinst.ini

可通过dpkg -L odbc-postgresql命令确认驱动文件的实际路径,确保配置正确。

4. 在R连接代码中指定驱动

修改R代码,明确指定驱动名称(对应odbcinst.ini中的[PostgreSQL]):

DBI::dbConnect(
    odbc::odbc(),
    Driver = "PostgreSQL",
    Server=server,
    Database=database,
    UID=user,
    PWD=password
)

5. 检查驱动文件权限与依赖

如果坚持使用复制的psqlodbcw.so,需完成以下操作:

  • 设置文件可读取权限:
RUN chmod 755 /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
  • 检查动态链接库依赖,缺失则安装对应包:
RUN ldd /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
# 示例:若缺失libpq.so,安装依赖包
RUN apt-get install -y libpq-dev

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:27:22