如何在Docker中使用PHP7.2和pdo_informix制作图像?

如何在Docker中使用PHP7.2和pdo_informix制作图像?,php,docker,ubuntu,informix,pecl,Php,Docker,Ubuntu,Informix,Pecl,我正在尝试使用apache2在docker中创建映像,使用pdo_informix在php7.2中创建映像,但是我没有成功,我只是没有看到扩展被启用,我不知道我是否执行了错误的步骤 我在以下存储库中共享我目前拥有的内容: Dockerfile: FROM ibmcom/informix-developer-database USER root RUN sudo rm /var/lib/apt/lists/lock RUN sudo apt-get update && sudo

我正在尝试使用apache2在docker中创建映像,使用pdo_informix在php7.2中创建映像,但是我没有成功,我只是没有看到扩展被启用,我不知道我是否执行了错误的步骤

我在以下存储库中共享我目前拥有的内容:

Dockerfile:

FROM ibmcom/informix-developer-database
USER root
RUN sudo rm /var/lib/apt/lists/lock
RUN sudo apt-get update && sudo apt-get -y upgrade
RUN sudo apt-get install -y tzdata
RUN sudo apt-get install git nodejs npm composer nano tree vim curl ftp -y
ENV TZ=America/Bogota
ENV LICENSE=accept
RUN sudo apt-get -y install apache2
RUN sudo apt-get install -y \
        php \
        php-bz2 \
        php-cgi \
        php-cli \
        php-common \
        php-curl \
        php-dev \
        php-enchant \
        php-fpm \
        php-gd \
        php-gmp \
        php-imap \
        php-interbase \
        php-intl \
        php-json \
        php-ldap \
        php-mbstring \
        php-mysql \
        php-odbc \
        php-opcache \
        php-pgsql \
        php-phpdbg \
        php-pspell \
        php-readline \
        php-recode \
        php-soap \
        php-snmp \
        php-sqlite3 \
        php-sybase \
        php-tidy \
        php-xmlrpc \
        php-xsl \
        php-zip
RUN sudo apt-get install -y libapache2-mod-php
RUN sudo apt-get update && sudo apt-get -y upgrade

VOLUME /var/www/html

COPY  index.php /var/www/html

ENV INFORMIXDIR /opt/ibm/informix
ENV PATH $INFORMIXDIR/bin:$PATH

COPY scripts/PDO_INFORMIX-1.3.3.tgz /tmp
COPY scripts/install-informixpdo.sh /tmp
RUN sudo sh /tmp/install-informixpdo.sh

#Informix environment variables for Apache
COPY scripts/envvars.sh /tmp
RUN sudo sh /tmp/envvars.sh
RUN echo "extension=pdo_informix.so" >> /etc/php/7.2/apache2/conf.d/pdo.ini
RUN sudo echo "sqlexec  9088/tcp\nsqlexec-ssl  9089/tcp" >> /etc/services

EXPOSE 80
PDO_DIRECTORY=PDO_INFORMIX-1.3.3
PDO_FILENAME=$PDO_DIRECTORY.tgz

TMPDIR=/tmp
tar  -xvf $TMPDIR/$PDO_FILENAME  -C $TMPDIR/
cd  $TMPDIR/$PDO_DIRECTORY
phpize  &&  ./configure  && make  &&  make install

rm -r $TMPDIR/*
echo "INFORMIXDIR=/opt/ibm/informix
export INFORMIXDIR
DB_LOCALE=es_es.8859-1
export DB_LOCALE
" >> /etc/apache2/envvars
安装informixpdo.sh:

FROM ibmcom/informix-developer-database
USER root
RUN sudo rm /var/lib/apt/lists/lock
RUN sudo apt-get update && sudo apt-get -y upgrade
RUN sudo apt-get install -y tzdata
RUN sudo apt-get install git nodejs npm composer nano tree vim curl ftp -y
ENV TZ=America/Bogota
ENV LICENSE=accept
RUN sudo apt-get -y install apache2
RUN sudo apt-get install -y \
        php \
        php-bz2 \
        php-cgi \
        php-cli \
        php-common \
        php-curl \
        php-dev \
        php-enchant \
        php-fpm \
        php-gd \
        php-gmp \
        php-imap \
        php-interbase \
        php-intl \
        php-json \
        php-ldap \
        php-mbstring \
        php-mysql \
        php-odbc \
        php-opcache \
        php-pgsql \
        php-phpdbg \
        php-pspell \
        php-readline \
        php-recode \
        php-soap \
        php-snmp \
        php-sqlite3 \
        php-sybase \
        php-tidy \
        php-xmlrpc \
        php-xsl \
        php-zip
RUN sudo apt-get install -y libapache2-mod-php
RUN sudo apt-get update && sudo apt-get -y upgrade

VOLUME /var/www/html

COPY  index.php /var/www/html

ENV INFORMIXDIR /opt/ibm/informix
ENV PATH $INFORMIXDIR/bin:$PATH

COPY scripts/PDO_INFORMIX-1.3.3.tgz /tmp
COPY scripts/install-informixpdo.sh /tmp
RUN sudo sh /tmp/install-informixpdo.sh

#Informix environment variables for Apache
COPY scripts/envvars.sh /tmp
RUN sudo sh /tmp/envvars.sh
RUN echo "extension=pdo_informix.so" >> /etc/php/7.2/apache2/conf.d/pdo.ini
RUN sudo echo "sqlexec  9088/tcp\nsqlexec-ssl  9089/tcp" >> /etc/services

EXPOSE 80
PDO_DIRECTORY=PDO_INFORMIX-1.3.3
PDO_FILENAME=$PDO_DIRECTORY.tgz

TMPDIR=/tmp
tar  -xvf $TMPDIR/$PDO_FILENAME  -C $TMPDIR/
cd  $TMPDIR/$PDO_DIRECTORY
phpize  &&  ./configure  && make  &&  make install

rm -r $TMPDIR/*
echo "INFORMIXDIR=/opt/ibm/informix
export INFORMIXDIR
DB_LOCALE=es_es.8859-1
export DB_LOCALE
" >> /etc/apache2/envvars
envvars.sh:

FROM ibmcom/informix-developer-database
USER root
RUN sudo rm /var/lib/apt/lists/lock
RUN sudo apt-get update && sudo apt-get -y upgrade
RUN sudo apt-get install -y tzdata
RUN sudo apt-get install git nodejs npm composer nano tree vim curl ftp -y
ENV TZ=America/Bogota
ENV LICENSE=accept
RUN sudo apt-get -y install apache2
RUN sudo apt-get install -y \
        php \
        php-bz2 \
        php-cgi \
        php-cli \
        php-common \
        php-curl \
        php-dev \
        php-enchant \
        php-fpm \
        php-gd \
        php-gmp \
        php-imap \
        php-interbase \
        php-intl \
        php-json \
        php-ldap \
        php-mbstring \
        php-mysql \
        php-odbc \
        php-opcache \
        php-pgsql \
        php-phpdbg \
        php-pspell \
        php-readline \
        php-recode \
        php-soap \
        php-snmp \
        php-sqlite3 \
        php-sybase \
        php-tidy \
        php-xmlrpc \
        php-xsl \
        php-zip
RUN sudo apt-get install -y libapache2-mod-php
RUN sudo apt-get update && sudo apt-get -y upgrade

VOLUME /var/www/html

COPY  index.php /var/www/html

ENV INFORMIXDIR /opt/ibm/informix
ENV PATH $INFORMIXDIR/bin:$PATH

COPY scripts/PDO_INFORMIX-1.3.3.tgz /tmp
COPY scripts/install-informixpdo.sh /tmp
RUN sudo sh /tmp/install-informixpdo.sh

#Informix environment variables for Apache
COPY scripts/envvars.sh /tmp
RUN sudo sh /tmp/envvars.sh
RUN echo "extension=pdo_informix.so" >> /etc/php/7.2/apache2/conf.d/pdo.ini
RUN sudo echo "sqlexec  9088/tcp\nsqlexec-ssl  9089/tcp" >> /etc/services

EXPOSE 80
PDO_DIRECTORY=PDO_INFORMIX-1.3.3
PDO_FILENAME=$PDO_DIRECTORY.tgz

TMPDIR=/tmp
tar  -xvf $TMPDIR/$PDO_FILENAME  -C $TMPDIR/
cd  $TMPDIR/$PDO_DIRECTORY
phpize  &&  ./configure  && make  &&  make install

rm -r $TMPDIR/*
echo "INFORMIXDIR=/opt/ibm/informix
export INFORMIXDIR
DB_LOCALE=es_es.8859-1
export DB_LOCALE
" >> /etc/apache2/envvars

Dockerfile
中,使用
docker php ext install
命令安装
php
扩展或模块。如果使用reguler
apt get install
命令,则应添加步骤以启用该命令。请参见下面的示例,如何使用该命令:

FROM php:7.2-fpm

RUN apt-get update && apt-get install -y wget curl libxml2-dev libssl-dev zlib1g-dev apt-transport-https lsb-release ca-certificates \
    && wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg \
    && echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php.list \
    && docker-php-ext-install mbstring iconv xml pdo_mysql phar zip \

docker php ext install
将自动安装并启用扩展。希望有帮助。

我尝试了你的dockerfile脚本,发现了一些错误。docker构建输出确实显示了解包和编译PDO模块的跟踪: 但在PDO配置过程中失败并出现错误:

checking for gawk... no
checking for nawk... nawk
checking if nawk is broken... no
checking for Informix driver for PDO... yes, shared
configure: error: INFORMIXDIR environment variable is not set. Please use --with
-pdo-informix=<DIR> or set the INFORMIXDIR environment variable.
Removing intermediate container a73c9bfa211d
 ---> d86e02cc6801
Step 20/24 : COPY scripts/envvars.sh /tmp
它又在别的地方失败了。查看模块构建文件,它希望模块位于以下目录中:

-- config.m4 --

  AC_MSG_CHECKING([for PDO includes])
  if test -f $abs_srcdir/include/php/ext/pdo/php_pdo_driver.h; then
    pdo_inc_path=$abs_srcdir/ext
  elif test -f $abs_srcdir/ext/pdo/php_pdo_driver.h; then
    pdo_inc_path=$abs_srcdir/ext
  elif test -f $prefix/include/php/ext/pdo/php_pdo_driver.h; then
    pdo_inc_path=$prefix/include/php/ext
  else
    AC_MSG_ERROR([Cannot find php_pdo_driver.h.])
  fi
但在IBM docker映像中,该文件位于:

root@faf18c3c0ef5:/usr/include# find ./ -name php_pdo_driver.h
./php/20170718/ext/pdo/php_pdo_driver.h
root@faf18c3c0ef5:/usr/include#
所以我在dockerfile中添加了一个“ln-s”来创建软链接。 以下是我更改的两个文件:

---install-informixpdo.sh ---
...
PDO_DIRECTORY=PDO_INFORMIX-1.3.3
PDO_FILENAME=$PDO_DIRECTORY.tgz
export INFORMIXDIR=/opt/ibm/informix
TMPDIR=/tmp
tar  -xvf $TMPDIR/$PDO_FILENAME  -C $TMPDIR/
cd  $TMPDIR/$PDO_DIRECTORY
phpize  &&  ./configure  && make  &&  make install

rm -r $TMPDIR/*
...
----------  

通过这些更改,我在执行“docker build”命令时编译并安装了模块

PHP使用apache配置加载模块:

root@99d4150d07ed:/# php -c /etc/php/7.2/apache2/conf.d/pdo.ini -m | grep inform
ix
pdo_informix
root@99d4150d07ed:/#
一个简单的连接,似乎也可以正常工作:

root@99d4150d07ed:/# cat t.php
<?php

$db = new PDO("informix:host=99d4150d07ed; service=9088;database=sysmaster; serv
er=informix; protocol=onsoctcp; EnableScrollableCursors=1;", "informix", "in4mix
");

print "Connection Established!</br></br>";

$stmt = $db->query("select * from systables");
$res = $stmt->fetch( PDO::FETCH_BOTH );
$rows = $res[0];
echo "Table contents: $rows.</br>";

?>
root@99d4150d07ed:/# php -c /etc/php/7.2/apache2/conf.d/pdo.ini t.php
Connection Established!</br></br>Table contents: systables.</br>root@99d4150d07e
d:/#
root@99d4150d07ed:/#cat t.php
root@99d4150d07ed:/#php-c/etc/php/7.2/apache2/conf.d/pdo.ini t.php
建立连接

表格内容:系统表
root@99d4150d07e d:/#
您可以在“install informixpdo.sh”文件中添加软链接创建和导出INFORMIXDIR

编辑:

root@886a4870f1d0:/var/www/html#cat t.php
root@886a4870f1d0:/var/www/html#php t.php
建立连接

表格内容:系统表
root@886a4870f1d0:/var/www/html# root@886a4870f1d0:/var/www/html#curlhttp://localhost/t.php 建立连接

表格内容:系统表
root@886a4870f1d0:/var/www/html# root@886a4870f1d0:/var/www/html#
我设法从一个
php:7.2-apache
image:

我刚刚在一个旧的Informix 7.2数据库上成功地测试了它

我从中获得了适用于Linux x86-64的客户端SDK版本4.10 FC9DE。
一旦正确设置了环境变量,设置就非常简单了


在编译PDO_Informix 1.3.3 PECL扩展时,我收到了一些警告,但它仍然有效。

您能否提供更多详细信息,包括问题中的相关代码,说明哪些不起作用?SO帮助中心提供了更多提示。您好David,感谢您的回答,存储库中有用于创建图像的Dockerfile.:。我的问题是没有启用扩展pdo_informix,我不知道发生了什么,我做得很糟糕。请在你的问题中直接发布所有相关信息(和更新)(以及你只链接的代码),因为链接可能会更改(这里你删除了github项目),因此不会让其他有同样问题的人受益。现在更新,我希望您能帮助我。您好,谢谢您的回复,我已经用这种方式尝试过了,但是我不能,因为要实现到informix的连接,还需要安装informix的SDK客户端,这就是为什么我直接使用IBM已经安装informix的映像,我在安装apache以识别php时也遇到了该图像的问题。我很感激您的回答,但我发现您没有尝试您的解决方案。您好,感谢您的回答,进行了上述更改,在进行docker构建时我没有发现错误,但在执行
phpinfo()
时,我没有看到启用的扩展。更新我的
Github
存储库,以便您可以看到所做的更改。您好,再次检查后,我的测试代码错误,现在我得到了与您相同的结果,我的问题是我没有看到在phpinfo()中启用扩展pdo_informix;当我用apache测试t.php文件时,出现了错误:
Excepcin capturada:找不到驱动程序
root@3ba5c8519590:/etc/php/7.2/apache2#php-i|grep pdo/etc/php/7.2/cli/conf.d/10-pdo.ini,/etc/php/7.2/cli/conf.d/20-pdo_dblib.ini,/etc/php/7.2/cli/conf.d/20-pdo_firebird.ini,/etc/php/7.2/cli/conf.d/20-pdo_mysql.ini,/etc/php/7.2/cli/conf.d/20-pdo_odbc.ini,/etc/php/7.2/cli/conf.d/20-pdo_pgsql.ini,/etc/php/7.2/cli/conf.d/20-pdo_sqlite.ini,API扩展=>mysqli,pdo_mysql pdo_dblib pdo_mysql pdo_mysql.default_socket=>/var/run/mysqld/mysqld.sock=>/var/run/mysqld/mysqld.sock pdo_pgsql pdo_sqliteroot@3ba5c8519590:/etc/php/7.2/apache2 35;
我猜您的php在apache2目录中选择的是默认的php.ini,而不是pdo.ini。这就是包含“extension=pdo_……”子句的地方。尝试运行:php-c/etc/php/7.2/apache2/conf.d/pdo.ini-m|grep inormix