Docker: unixodbc.h no such file or directory. "pecl install sqlsrv" error with unixodbc-dev already installed
直到几天前,这一直在起作用。我们正在用下面的代码构建一个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。
我通过安装以下版本的软件包解决了这个问题。
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
我也遇到了同样的问题,四天前我可以建立它,然后就出现了错误,后来我把我的pyodbc从4.0.32版本升级到最新的4.0.35版本,然后它就工作了。
在过去的几天里,我也遇到了同样的问题。根据别人的建议,我把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状态。目前,这似乎足以修复我的管道。
如果您使用的是带有Apache的PHP官方Docker镜像,您需要做的改变是降级到Buster并获得其他答案中建议的正确的软件包列表。
- 在顶部,将
FROM php:[version]-apache
改成FROM php:[version]-apache-buster
(FROM php:8.1-apache-buster
)。 - 将
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
这个问题发生在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。
这对我来说是有效的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
今天发生在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