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

