Docker: unixodbc.h no such file or directory. "pecl install sqlsrv" error with unixodbc-dev already installed

回答 7 浏览 3096 2023-02-11

直到几天前,这一直在起作用。我们正在用下面的代码构建一个docker容器,但这是在尝试"pecl install sqlsrv"时发生的错误。试图在这个容器中从PHP连接到mssql服务器。有没有比我更聪明的人有什么想法?

Docker的文件:

FROM  --platform=linux/amd64 php:8.0-fpm

RUN apt-get update && apt-get -y install nano apt-utils libxml2-dev gnupg \
    && apt-get install -y zlib1g-dev \
    && apt-get install -y libzip-dev \
    && docker-php-ext-install zip 

RUN apt-get -y install libicu-dev gcc g++ make autoconf libc-dev pkg-config libssl-dev apt-transport-https libgss3 

# Install MS ODBC Driver for SQL Server
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
    && curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update

# Automatically accept the terms from Microsoft
RUN apt-get install -y unixodbc unixodbc-dev odbcinst locales
RUN ACCEPT_EULA=Y apt-get install -y msodbcsql17
RUN apt-get -y install gcc g++ make autoconf libc-dev pkg-config
RUN apt-get update 
RUN pecl install sqlsrv
RUN pecl install pdo_sqlsrv
RUN docker-php-ext-enable sqlsrv pdo_sqlsrv

错误:

#0 41.16 In file included from /usr/include/sql.h:19,
#0 41.16                  from /tmp/pear/temp/sqlsrv/shared/xplat.h:30,
#0 41.16                  from /tmp/pear/temp/sqlsrv/shared/typedefs_for_linux.h:23,
#0 41.16                  from /tmp/pear/temp/sqlsrv/shared/xplat_winnls.h:24,
#0 41.16                  from /tmp/pear/temp/sqlsrv/shared/FormattedPrint.h:24,
#0 41.16                  from /tmp/pear/temp/sqlsrv/shared/core_sqlsrv.h:41,
#0 41.16                  from /tmp/pear/temp/sqlsrv/php_sqlsrv_int.h:25,
#0 41.16                  from /tmp/pear/temp/sqlsrv/conn.cpp:24:
#0 41.16 /usr/include/sqltypes.h:56:10: fatal error: unixodbc.h: No such file or directory
#0 41.16    56 | #include "unixodbc.h"
#0 41.16       |          ^~~~~~~~~~~~
#0 41.16 compilation terminated.
#0 41.18 make: *** [Makefile:209: conn.lo] Error 1
#0 41.19 ERROR: `make' failed

我试过了从 7.0 到 8.1 的每个版本的 PHP,无论是否有 fpm。我还试过几个版本的msodbcsql和unixodbc/unixodbc-dev以及几个版本的sqlsrv和pdo_sqlsrv。

dlove 提问于2023-02-11
你说这是试图连接到mysql服务器,sqlsrv是MS SQL服务器的。Manuel Barallobre Seoane 2023-02-12
基本问题是微软软件库中unixodbc-dev包的一个错误。在这里进行跟踪。github.com/microsoft/linux-package-repositories/issues/36rebroken 2023-02-13
7 个回答
#1楼
得票数 13

我通过安装以下版本的软件包解决了这个问题。

apt-get install unixodbc-dev=2.3.7 unixodbc=2.3.7 odbcinst1debian2=2.3.7 odbcinst=2.3.7

在错误得到解决之前,请使用这个方法。

来源:https://github.com/microsoft/linux-package-repositories/issues/36

Abraham Araujo Moreno 提问于2023-02-13
tdy 修改于2023-02-17
#2楼
得票数 6

我也遇到了同样的问题,四天前我可以建立它,然后就出现了错误,后来我把我的pyodbc从4.0.32版本升级到最新的4.0.35版本,然后它就工作了。

jeremy 提问于2023-02-12
这对我的Python 3.8 slim-buster图像也起到了一定的作用。Wim 2023-02-15
#3楼
得票数 2

在过去的几天里,我也遇到了同样的问题。根据别人的建议,我把debian core从bullseye降级到buster (11 -> 10),并在软件包列表中把debian ver改为9,就像其他回复中提到的那样。

我曾试图简单地指定一个较早的驱动程序(5.9.0),同时仍在运行bullseye,但无济于事。

它似乎仍在成功地使用驱动5.10.1,在buster w/ stretch sources list下。我正在运行 php 8.2 FWW。

鉴于这个问题的突然出现,我预计将在工作中进行修复。如果我了解到任何新的情况,我会修正这个回复,希望我可以在接下来的几天里恢复到bullseye状态。目前,这似乎足以修复我的管道。

David Claiborne 提问于2023-02-12
#4楼
得票数 2

如果您使用的是带有Apache的PHP官方Docker镜像,您需要做的改变是降级到Buster并获得其他答案中建议的正确的软件包列表。

  1. 在顶部,将FROM php:[version]-apache改成FROM php:[version]-apache-busterFROM php:8.1-apache-buster)。
  2. RUN curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list改成RUN curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list
Rebecca 提问于2023-02-13
#5楼 已采纳
得票数 1

这个问题发生在Debian 10和11的Drive 5.10.0或5.10.1上。

用驱动5.9.0和Debian 10,PHP 7.4,但repo microsoft debian 9。它正常了!!!。

在Debian 10中,用php 8.1将存储库从Debian 10改成Debian 9,它将创建Docker脚本,我还没有测试它是否会连接到数据库,我相信会的。

https://packages.microsoft.com/config/debian/10/prod.list改为https://packages.microsoft.com/config/debian/9/prod.list

Bjverde 提问于2023-02-12
Bjverde 修改于2023-02-12
#6楼
得票数 1

这对我来说是有效的ubuntu 22.04

RUN ACCEPT_EULA=Y apt-get install -y \
    msodbcsql17 \
    mssql-tools \
    unixodbc-dev=2.3.7 \
    unixodbc=2.3.7 \
    odbcinst1debian2=2.3.7 \
    odbcinst=2.3.7

RUN echo 'export PATH="$PATH:/opt/mssql-tools17/bin"' >> ~/.bashrc
RUN exec bash

RUN pecl install sqlsrv-5.8.0
RUN printf "; priority=20\nextension=sqlsrv.so\n" > /etc/php/7.3/mods-available/sqlsrv.ini
Yerlan Amantaiuly 提问于2023-02-14
Eugene Kaurov 修改于2023-02-16
#7楼
得票数 0

今天发生在php:7.3-fpm-buster上,将Debian列表从10改为9就可以解决这个问题。

curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list

修改为

curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list

Hamza AlZaatreh 提问于2023-02-12