Я новичок в настройке Oracle базы данных на сервере, и я настраиваю NGINX PHP -FPM 7.4 Alpine и Oracle База данных, используя Docker на сервере CentOS7 (centos-release- 7-7.1908.0.el7.centos.x86_64).
Я уже успешно установил базу данных Oracle в Docker, , поэтому моя следующая задача - иметь возможность подключиться к базе данных Oracle с помощью функции oci_connect
в PHP . Вот где я застрял. Я следовал за этим и загружал необходимое программное обеспечение, такое как Oracle Instant Client. (Я использовал последнюю версию на момент написания этой статьи: instantclient-basi c - linux .x64-19.6.0.0.0dbru)
Я получил следующие файлы для docker -compose:
docker -compose.yml:
version: '3'
services:
web:
image: nginx:alpine
ports:
- 8080:80
volumes:
- ./web:/var/www/web
- ./log:/var/log/nginx
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
restart: always
phpfpm:
build:
context: ./php-fpm
dockerfile: Dockerfile
volumes:
- ./web:/var/www/web
php -fpm / Dockerfile:
FROM php:7.4-fpm-alpine
RUN mkdir -p /var/www/web
# custom.ini is basically my php.ini
ADD custom.ini /usr/local/etc/php/conf.d/custom.ini
RUN apk add --update --no-cache \
libzip-dev \
curl-dev \
libxml2-dev \
libpng-dev \
$PHPIZE_DEPS \
php7-openssl
RUN docker-php-ext-configure gd
RUN docker-php-ext-install \
curl \
dom \
gd \
json \
tokenizer \
zip
# Install Oracle Instantclient
RUN mkdir /opt/oracle \
&& cd /opt/oracle
ADD instantclient-basic-linux.x64-19.6.0.0.0dbru.zip /opt/oracle/instantclient-basic-linux.x64-19.6.0.0.0dbru.zip
ADD instantclient-sdk-linux.x64-19.6.0.0.0dbru.zip /opt/oracle/instantclient-sdk-linux.x64-19.6.0.0.0dbru.zip
RUN rm -rf /opt/oracle/instantclient_19_6/*
RUN unzip /opt/oracle/instantclient-basic-linux.x64-19.6.0.0.0dbru.zip -d /opt/oracle \
&& unzip /opt/oracle/instantclient-sdk-linux.x64-19.6.0.0.0dbru.zip -d /opt/oracle \
&& ln -sf /opt/oracle/instantclient_19_6/libclntsh.so.19.1 /opt/oracle/instantclient_19_6/libclntsh.so \
&& ln -sf /opt/oracle/instantclient_19_6/libclntshcore.so.19.1 /opt/oracle/instantclient_19_6/libclntshcore.so \
&& ln -sf /opt/oracle/instantclient_19_6/libocci.so.19.1 /opt/oracle/instantclient_19_6/libocci.so \
&& rm -rf /opt/oracle/*.zip
# Install Oracle extensions
RUN docker-php-ext-configure pdo_oci --with-pdo-oci=instantclient,/opt/oracle/instantclient_19_6,19.1 \
&& echo 'instantclient,/opt/oracle/instantclient_19_6/' | pecl install oci8 \
&& docker-php-ext-install \
pdo_oci \
&& docker-php-ext-enable \
oci8
RUN apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ --allow-untrusted gnu-libiconv
ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php
EXPOSE 9000
CMD ["php-fpm"]
Кроме того, я также добавил эти Oracle связанные «расширения» в custom.ini (в основном мой php .ini), который упоминается в php -fpm / Dockerfile выше:
expose_php = Off
extension=oci8.so
extension=pdo_oci.so
docker - составить
Когда я выполню docker - составить, я вижу, что процесс сборки может быть завершен, но я попал в Следующие предупреждения в выводе сборки:
...
...
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20190902/
PHP Warning: PHP Startup: Unable to load dynamic library 'oci8.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so (Error loading shared library /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so: No such file or directory), /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so.so (Error loading shared library /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so.so: No such file or directory)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_oci.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so (Error loading shared library /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so: No such file or directory), /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so.so (Error loading shared library /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so.so: No such file or directory)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'oci8.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so (Error loading shared library /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so: No such file or directory), /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so.so (Error loading shared library /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so.so: No such file or directory)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_oci.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so (Error loading shared library /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so: No such file or directory), /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so.so (Error loading shared library /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so.so: No such file or directory)) in Unknown on line 0
...
...
Это "Невозможно загрузить динамические c библиотеки" oci8.so "и" pdo_oci.so "" происходит в сборке примерно 20 раз.
После того, как весь процесс сборки завершен, запускается php -fpm, но у него также есть похожие предупреждения:
Successfully built c5fe0a0bc6ab
Successfully tagged nginx-php_phpfpm:latest
Starting nginx-php_web_1 ... done
Creating nginx-php_phpfpm_1 ... done
Attaching to nginx-php_web_1, nginx-php_phpfpm_1
phpfpm_1 | [20-Mar-2020 11:30:03] NOTICE: PHP message: PHP Warning: PHP Startup: Unable to load dynamic library 'oci8.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so (Error loading shared library libnsl.so.1: No such file or directory (needed by /opt/oracle/instantclient_19_6//libclntsh.so.19.1)), /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so.so (Error loading shared library /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so.so: No such file or directory)) in Unknown on line 0
phpfpm_1 | [20-Mar-2020 11:30:03] NOTICE: PHP message: PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_oci.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so (Error loading shared library libnsl.so.1: No such file or directory (needed by /opt/oracle/instantclient_19_6/libclntsh.so.19.1)), /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so.so (Error loading shared library /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so.so: No such file or directory)) in Unknown on line 0
phpfpm_1 | [20-Mar-2020 11:30:03] NOTICE: PHP message: PHP Warning: PHP Startup: Unable to load dynamic library 'oci8.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so (Error loading shared library libnsl.so.1: No such file or directory (needed by /opt/oracle/instantclient_19_6//libclntsh.so.19.1)), /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so.so (Error loading shared library /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so.so: No such file or directory)) in Unknown on line 0
phpfpm_1 | [20-Mar-2020 11:30:03] NOTICE: PHP message: PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_oci.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so (Error loading shared library libnsl.so.1: No such file or directory (needed by /opt/oracle/instantclient_19_6/libclntsh.so.19.1)), /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so.so (Error loading shared library /usr/local/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so.so: No such file or directory)) in Unknown on line 0
phpfpm_1 | [20-Mar-2020 11:30:03] NOTICE: fpm is running, pid 1
phpfpm_1 | [20-Mar-2020 11:30:03] NOTICE: ready to handle connections
PHP Test
Я также проверил это с файлом. php:
<?php
$objConnect = oci_connect('SYSTEM', 'xxxxxxxxxx', 'x.x.x.x');
if($objConnect)
{
echo "Oracle Server Connected";
}
?>
Очевидно, это приводит к браузеру:
Fatal error: Uncaught Error: Call to undefined function oci_connect() in /var/www/web/public/index.php:3 Stack trace: #0 {main} thrown in /var/www/web/public/index.php on line 3
Просмотр контейнера
Я также попытался заглянуть в сам контейнер с помощью: docker exec -it 623 sh
, чтобы проверить каталог, на который ссылается приложение:
/usr/local/lib/php/extensions/no-debug-non-zts-20190902 # ls -la
total 2588
drwxr-xr-x 1 root root 39 Mar 20 11:29 .
drwxr-xr-x 1 root root 39 Mar 19 22:43 ..
-rwxr-xr-x 1 root root 122288 Mar 20 11:28 curl.so
-rwxr-xr-x 1 root root 249824 Mar 20 11:28 dom.so
-rwxr-xr-x 1 root root 433280 Mar 20 11:29 gd.so
-rwxr-xr-x 1 root root 54944 Mar 20 11:29 json.so
-rw-r--r-- 1 root root 911808 Mar 20 11:29 oci8.so
-rwxr-xr-x 1 root root 579504 Mar 19 22:43 opcache.so
-rwxr-xr-x 1 root root 51368 Mar 20 11:29 pdo_oci.so
-rwxr-xr-x 1 root root 108128 Mar 19 22:43 sodium.so
-rwxr-xr-x 1 root root 35952 Mar 20 11:29 tokenizer.so
-rwxr-xr-x 1 root root 89600 Mar 20 11:29 zip.so
Я вижу, что все файлы есть, так что тогда с Unable to load dynamic library 'oci8.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20190902/oci8.so
? Почему он не может найти библиотеку, когда он находится в контейнере?
Другие вещи, которые я пробовал:
Я также попытался осмотреть StackOverflow и попробовал этот ответ , но все же, добавив ENV LD_LIBRARY_PATH /usr/local/lib/php/extensions/no-debug-non-zts-20190902
в мой Dockerfile НЕ решает проблему.
Я что-то упустил в этом случае? Что я должен сделать, чтобы он мог разрешить библиотеки? Или в этом случае есть проблемы несовместимости?