如何在Docker中使用PHP7.2和pdo_informix制作图像?
我正在尝试使用apache2在docker中创建映像,使用pdo_informix在php7.2中创建映像,但是我没有成功,我只是没有看到扩展被启用,我不知道我是否执行了错误的步骤 我在以下存储库中共享我目前拥有的内容: Dockerfile:如何在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
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
扩展或模块。如果使用regulerapt 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