安装/配置 SQL Server PDO 驱动程序以供 PHP docker 镜像使用

10

我有一个简单的 Docker 文件,如下所示:

FROM php:7.2-apache
COPY src/ /var/www/html/

通常,我会通过在Dockerfile中添加以下内容来安装Mongo或MySQL连接的驱动程序:

docker-php-ext-install mongo

在这个场合,我想把我的php应用程序连接到一个SQL Server数据库,并且我知道对于php 7.x来说,最好的方法是使用PDO驱动程序。然而,我不熟悉如何在dockerfile中配置它。

我尝试过使用pecl install,例如添加:

RUN pecl install sqlsrv pdo_sqlsrv

然而,这种方法会出现一系列错误,似乎没有指引我正确的方向。
我只是在寻找一个简单的方法,在dockerfile或使用docker run来完成这个任务。
额外的信息,这里是我得到的错误:
/tmp/pear/temp/sqlsrv/shared/xplat.h:30:17: fatal error: sql.h: No such file or directory
 #include <sql.h>
                 ^
compilation terminated.
Makefile:194: recipe for target 'conn.lo' failed
make: *** [conn.lo] Error 1
ERROR: `make' failed
The command '/bin/sh -c pecl install sqlsrv pdo_sqlsrv     && docker-php-ext-enable pdo_sqlsrv' returned a non-zero code: 1

感谢大家。

你先执行了 RUN docker-php-ext-install pdo 吗? - Loek
我已经尝试过了,是的,我得到了相同的错误,请参见编辑后的主帖,我已经包含了错误信息。谢谢。 - Molenpad
4个回答

20

我已经为这个确切的目的创建了一个Docker文件:

FROM php:7.3-apache
ENV ACCEPT_EULA=Y
RUN apt-get update && apt-get install -y gnupg2
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - 
RUN curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list 
RUN apt-get update 
RUN ACCEPT_EULA=Y apt-get -y --no-install-recommends install msodbcsql17 unixodbc-dev 
RUN pecl install sqlsrv
RUN pecl install pdo_sqlsrv
RUN docker-php-ext-enable sqlsrv pdo_sqlsrv

COPY . /var/www/html/

享受吧!


1
你怎么不在顶部?干得好! - Jamie Krcmar

9
你得到了这个问题的答案吗?我使用以下步骤使其正常工作。(unixodbc-dev包应该能帮助你通过pecl安装。)
在Docker文件中:
RUN apt-get -y install unixodbc-dev
RUN pecl install sqlsrv pdo_sqlsrv

接下来,您需要对php.ini进行一些更改以启用sqlserver。

获取php.ini的本地副本,并添加以下行:

extension=pdo_sqlsrv.so
extension=sqlsrv.so

然后将本地的php.ini文件复制到docker镜像中(我的文件在本地的“config”文件夹中)。

在Docker文件中:

COPY config/php.ini /usr/local/etc/php/

2
我完全按照您的指示操作,但是出现了以下错误:连接到 SQL Server 出错:SQLSTATE[IMSSP]:此扩展需要 Microsoft ODBC Driver for SQL Server 与 SQL Server 进行通信。访问以下网址下载 x64 版本的 ODBC Driver for SQL Server:https://go.microsoft.com/fwlink/?LinkId=163712。我需要在某个地方下载并集成 "pdo_sqlsrv.so" 和 "sqlsrv.so" 文件吗? - chris
你解决了这个问题吗,@chris? - Mohamed Raza
@MohamedRaza,我刚刚将我的配置发布为答案(https://dev59.com/Ea3la4cB1Zd3GeqPSMh6#75222902)。 - chris
@chris 好的,我会检查。 - Mohamed Raza

1

我的Docker配置:

###############
# MSSQL support
###############
RUN apt-get update \
    && apt-get install -y gpg unixodbc unixodbc-dev \
    && docker-php-ext-install pdo pdo_mysql \
    && pecl install sqlsrv pdo_sqlsrv

# ------------ Install MS SQL client deps ------------ #
# adding custom MS repository
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list

# install SQL Server drivers and tools
RUN apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql17
RUN echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
RUN /bin/bash -c "source ~/.bashrc"

# Debian 9 msodbcsql : https://packages.microsoft.com/debian/9/prod/pool/main/m/msodbcsql17/
RUN wget https://packages.microsoft.com/debian/9/prod/pool/main/m/msodbcsql17/msodbcsql17_17.4.2.1-1_amd64.deb
RUN ACCEPT_EULA=Y dpkg -i msodbcsql17_17.4.2.1-1_amd64.deb

RUN apt-get -y install locales
RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
RUN locale-gen

RUN echo "extension=sqlsrv.so" >> /usr/local/etc/php/conf.d/docker-php-ext-sqlsrv.ini
RUN echo "extension=pdo_sqlsrv.so" >> /usr/local/etc/php/conf.d/docker-php-ext-pdo-sqlsrv.ini
# -------------- END MSSQL -------------------------------- #

0
FROM php:7.4.0-apache
ENV ACCEPT_EULA=Y
RUN apt-get update && apt-get install -y gnupg2
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - 
RUN curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list 
RUN apt-get update 
RUN ACCEPT_EULA=Y apt-get -y --no-install-recommends install msodbcsql17 unixodbc-dev 
RUN pecl install sqlsrv
RUN pecl install pdo_sqlsrv
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-enable sqlsrv pdo_sqlsrv pdo pdo_mysql
COPY index.php /var/www/html/

它运行良好。 - Pablo Devops
“enter code here” 应该填写什么? - apripuppey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接