如何在Dockerfile中安装SIMBA ODBC驱动,本地测试Databricks连接的.NET WebAPI
解决Docker容器中安装SIMBA ODBC驱动连接Databricks的问题
问题分析
你遇到的错误源于两个核心问题:
- 驱动安装时的依赖检测未正确识别到满足版本要求的unixODBC
- 容器中缺少
libodbc.so.2的链接(Debian Buster默认的unixODBC库文件为libodbc.so.1,但驱动要求的是libodbc.so.2)
修正后的Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build WORKDIR /src COPY ["NuGet.Config", "."] COPY ["src/myApi/myApi.csproj", "src/myApi/"] COPY ["src/myApi.Models/myApi.Models.csproj", "src/myApi.Models/"] RUN dotnet restore "src/myApi/myApi.csproj" COPY . . WORKDIR "/src/src/myApi" RUN dotnet build "myApi.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "myApi.csproj" -c Release -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . # 安装驱动必需的依赖 RUN apt update && apt install -y --no-install-recommends \ unixodbc unixodbc-dev \ unzip libsasl2-modules-gssapi-mit \ && rm -rf /var/lib/apt/lists/* # 创建软链接解决libodbc.so.2找不到的问题 RUN ln -s /usr/lib/x86_64-linux-gnu/libodbc.so.1 /usr/lib/x86_64-linux-gnu/libodbc.so.2 # 下载并安装SIMBA Spark ODBC驱动 RUN curl -sL https://databricks.com/wp-content/uploads/drivers-2020/SimbaSparkODBC-2.6.16.1019-Debian-64bit.zip -o databricksOdbc.zip \ && unzip databricksOdbc.zip \ && dpkg -i SimbaSparkODBC-2.6.16.1019-Debian-64bit/simbaspark_2.6.16.1019-2_amd64.deb \ && rm -rf databricksOdbc.zip SimbaSparkODBC-2.6.16.1019-Debian-64bit # 配置ODBC驱动到系统配置文件,确保ODBC管理器能识别 RUN echo "[Simba Spark ODBC Driver]" >> /etc/odbcinst.ini \ && echo "Description=Simba Spark ODBC Driver" >> /etc/odbcinst.ini \ && echo "Driver=/opt/simba/spark/lib/64/libsparkodbc_sb64.so" >> /etc/odbcinst.ini ENTRYPOINT ["dotnet", "myApi.dll"]
关键修改说明
- 精简依赖:移除了不需要的
freetds-dev、sqsh、tdsodbc,仅保留驱动必需组件,缩小镜像体积 - 软链接修复:通过
ln -s将系统默认的libodbc.so.1映射为驱动要求的libodbc.so.2,解决库加载失败问题 - 清理冗余文件:安装完成后删除下载的压缩包和解压目录,避免镜像冗余
- 驱动配置:手动将驱动路径写入系统ODBC配置文件,确保驱动能被ODBC管理器识别
额外注意事项
- 连接Databricks时,确保连接字符串中的驱动路径与容器内的
/opt/simba/spark/lib/64/libsparkodbc_sb64.so一致 - 运行容器时,建议通过环境变量传入Databricks的主机名、Token、集群ID等敏感参数,避免硬编码到代码中
内容的提问来源于stack exchange,提问作者191180rk
相关产品推荐
相关产品推荐

