如何在 php docker 容器上安装/启用 pdo-odbc 驱动程序?

Posted

技术标签:

【中文标题】如何在 php docker 容器上安装/启用 pdo-odbc 驱动程序?【英文标题】:How to install/enable pdo-odbc driver on a php docker container? 【发布时间】:2018-09-15 20:17:24 【问题描述】:

我目前无法为我的 php 应用程序编写 Dockerfile。 我的 Dockerfile 可以工作,但缺少连接到 MS SQL Server 数据库所需的 pdo-odbc 驱动程序。这是我当前的 Dockerfile:

FROM php:apache
RUN apt-get install && \
    apt-get update && \
    apt-get install tdsodbc unixodbc unixodbc-dev -y && \
    docker-php-ext-configure pdo_odbc --with-pdo-odbc=unixODBC,/usr && \
    docker-php-ext-enable pdo_odbc && \
    a2enmod rewrite && \
    service apache2 restart && \
    sed -ri -e 's!/var/www/html!$APACHE_DOCUMENT_ROOT!g' /etc/apache2/sites-available/*.conf && \
    sed -ri -e 's!/var/www/!$APACHE_DOCUMENT_ROOT!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf && \
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
    php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061')  echo 'Installer verified';  else  echo 'Installer corrupt'; unlink('composer-setup.php');  echo PHP_EOL;" && \
    php composer-setup.php && \
    php -r "unlink('composer-setup.php');" && \
    mv composer.phar /usr/local/bin/composer
COPY php.ini /usr/local/etc/php/
COPY . /var/www/html/

脚本在我尝试启用扩展的第 6 行崩溃:

error: /usr/local/lib/php/extensions/no-debug-non-zts-20170718/pdo_odbc does not exist

usage: /usr/local/bin/docker-php-ext-enable [options] module-name [module-name ...]
   ie: /usr/local/bin/docker-php-ext-enable gd mysqli
       /usr/local/bin/docker-php-ext-enable pdo pdo_mysql
       /usr/local/bin/docker-php-ext-enable --ini-name 0-apc.ini apcu apc

Possible values for module-name:

opcache.so sodium.so

Some of the above modules are already compiled into PHP; please check
the output of "php -i" to see which modules are already loaded.

我也尝试过使用 docker-php-ext-install 但还是不行。我们如何安装或启用此扩展程序?

【问题讨论】:

【参考方案1】:

这对我有用:

RUN apt-get install unixodbc unixodbc-dev -y \
 && docker-php-ext-configure pdo_odbc --with-pdo-odbc=unixODBC,/usr \
 && docker-php-ext-install pdo_odbc

【讨论】:

我试过这个并得到这个错误 Building dependency tree... Reading state information... E: Unable to locate package unixodbc E: Unable to locate package unixodbc-dev The command '/bin/sh -c apt-get install unixodbc unixodbc-dev -y && docker-php-ext-configure pdo_odbc --with-pdo-odbc=unixODBC,/usr && docker-php-ext-install pdo_odbc' 返回一个非零代码: 100 添加 RUN "apt-get update &&" apt-get install... 后它工作...【参考方案2】:

根据https://github.com/docker-library/php/issues/103你可以试试这个:

FROM php
RUN apt-get update && apt-get install -y unixODBC-dev && rm -rf /var/lib/apt/lists/*
RUN set -x \
&& cd /usr/src/php/ext/odbc \
&& phpize \
&& sed -ri 's@^ *test +"\$PHP_.*" *= *"no" *&& *PHP_.*=yes *$@#&@g' configure \
&& ./configure --with-unixODBC=shared,/usr \
&& docker-php-ext-install odbc

【讨论】:

这个答案适用于 odbc,而 OP 要求 pdo-odbc,这是不同的。 PHP 和它的模块名称是一团糟!无论如何都支持,因为该链接帮助我解决了我的问题。

以上是关于如何在 php docker 容器上安装/启用 pdo-odbc 驱动程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cassandra 4.0 Docker 容器上启用完整查询日志记录?

如何在 Tomee docker 容器上启用 https?

Docker:如何安装 PHP 7.4 扩展 ext-http?

如何在 Docker 上安装 mcrypt

如何启用从 Docker 容器内部启动的 Spark-Mesos 作业?

Docker LAMP 堆栈