Я пытаюсь создать образ в докере с apache2, php7.2 с pdo_informix, но у меня ничего не получилось, я просто не вижу включенного расширения и не знаю, делаю ли я неправильный шаг.

Я делюсь тем, что у меня есть, в следующем хранилище: здесь

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

< Сильный > install-informixpdo.sh :

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/*

< Сильный > envvars.sh :

echo "INFORMIXDIR=/opt/ibm/informix
export INFORMIXDIR
DB_LOCALE=es_es.8859-1
export DB_LOCALE
" >> /etc/apache2/envvars
2
Andrés 21 Авг 2018 в 01:45

3 ответа

Лучший ответ

Я попробовал ваш скрипт 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

Я изменил сценарий, который собирает модуль, так что INFORMIXDIR устанавливается перед запуском конфигурации.

checking for PHP extension directory... /usr/lib/php/20170718
checking for PHP installed headers prefix... /usr/include/php/20170718
checking if debug is enabled... no
checking if zts is enabled... no
checking for re2c... no
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate
 PHP parsers.
checking for gawk... no
checking for nawk... nawk
checking if nawk is broken... no
checking for Informix driver for PDO... yes, shared
checking for PDO includes... configure: error: Cannot find php_pdo_driver.h.
Removing intermediate container deee5a938a6e

Снова это терпело неудачу где-то еще. Глядя на файл сборки модуля, он ожидает модуль в следующих каталогах:

-- 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 этот файл находится в:

root@faf18c3c0ef5:/usr/include# find ./ -name php_pdo_driver.h
./php/20170718/ext/pdo/php_pdo_driver.h
root@faf18c3c0ef5:/usr/include#

Поэтому я добавил «ln -s» в файл Docker, чтобы создать программную ссылку. Это два файла, которые я изменил:

---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/*
...
----------  

А также

--- dockerfile ---
....
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 ln -s /usr/include/php/20170718/ext /usr/include/php/ext
RUN sudo sh /tmp/install-informixpdo.sh

#Informix environment variables for Apache
COPY scripts/envvars.sh /tmp
...
-------------

С этими изменениями я получаю модуль, скомпилированный и установленный при выполнении команды "docker build"

....
....
----------------------------------------------------------------------
Libraries have been installed in:
   /tmp/PDO_INFORMIX-1.3.3/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the 'LD_RUN_PATH' environment variable
     during linking
   - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /usr/lib/php/20170718/
Removing intermediate container 43bc22fb8234
 ---> 256d3fabdc70
Step 22/26 : COPY envvars.sh /tmp
....

Использование 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:/#

Вы можете просто добавить создание мягкой ссылки и экспорт INFORMIXDIR в файл 'install-informixpdo.sh'.

РЕДАКТИРОВАТЬ:

root@886a4870f1d0:/var/www/html# cat t.php
<?php
$db = new PDO("informix:host=".getenv('HOSTNAME')."; service=9088;database=sysmaster; server=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@886a4870f1d0:/var/www/html# php t.php
Connection Established!</br></br>Table contents: systables.</br>root@886a4870f1d0:/var/www/html#
root@886a4870f1d0:/var/www/html# curl http://localhost/t.php
Connection Established!</br></br>Table contents: systables.</br>root@886a4870f1d0:/var/www/html#
root@886a4870f1d0:/var/www/html#
1
jsagrera 22 Авг 2018 в 11:12

Мне удалось заставить работать контейнер, вдохновленный примером Джоан Риверы, из php:7.2-apache изображение :
https://github.com/vctls/docker_php_pdo_informix

Я только что успешно проверил его на устаревшей базе данных Informix 7.2.

Клиентский SDK версии 4.10 FC9DE для Linux x86-64 я получил по адресу веб-сайт IBM.
Настройка довольно проста, если вы правильно поняли переменные окружения.

Я получил несколько предупреждений при компиляции расширения PECL PDO_Informix 1.3.3, но, тем не менее, оно работает.

0
vctls 15 Янв 2019 в 16:22

В Dockerfile используйте команду docker-php-ext-install для установки расширения php или модуля. Если вы используете обычную команду 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 установит и включит расширение автоматически. Надеюсь, поможет.

0
Dharma Saputra 21 Авг 2018 в 01:26
51939425