ORA-28547 php-fpm 在 docker 容器中

ORA-28547 with php-fpm in docker container

我有一个工作的 php-fpm docker 容器充当 nginx 前端的 php 后端。我所说的工作是指它按预期在浏览器中呈现 phpinfo 输出。 我的 php-fpm 容器是由 devilbox docker 仓库的 php-fpm-7.4 prod 生成的。它启用了 OCI8。

问题:我在尝试时一直收到 ORA-28547 oci_connect

我做了什么:

1--添加/usr/lib/oracle/client64/lib到ld.so.conf.d和运行里面的一个文件 ldconfig -v 2--重启docker容器。
3-- 现在 phpinfo 显示 ORACLE_HOME=/usr/lib/oracle/client64/lib

4--将tnsnames.ora添加到/usr/lib/oracle/client6/lib/network/admin(该文件夹中有一个README.md文件甚至告诉你这样做) 5--再次重启 docker 容器。 6-oci_connect 仍然失败并出现同样的错误。

我错过了什么?

非常感谢您的任何指点,我想我已经浏览到 Internet 的末尾并返回,但还没有找到解决方案。

----解决方案:重新安装 instantclient,重新链接库 (ldconfig) 以使用新的 instantclient 库。创建修改后的 docker 文件以在创建容器时执行此操作。

我修改了 php-fpm 的 Dockerfile 文件以添加新的即时客户端文件,而不是原始文件提供的文件。我无法让它与他们合作。我已经尝试过几次重建图像(docker-compose up --build),这是可以解决问题的文件:

来自 devilbox/php-fpm:7.4-工作

#instantclient.conf内容:/opt/instantclient 运行 echo "/opt/instantclient" >/etc/ld.so.conf.d/instantclient.conf

WORKDIR /opt

运行 wget https://download.oracle.com/otn_software/linux/instantclient/19800/instantclient-sdk-linux.x64-19.8.0.0.0dbru.zip

运行 wget https://download.oracle.com/otn_software/linux/instantclient/19800/instantclient-sqlplus-linux.x64-19.8.0.0.0dbru.zip

运行 wget https://download.oracle.com/otn_software/linux/instantclient/19800/instantclient-basic-linux.x64-19.8.0.0.0dbru.zip

运行解压instantclient-sdk-linux.x64-19.8.0.0.0dbru.zip

运行解压instantclient-sqlplus-linux.x64-19.8.0.0.0dbru.zip

运行 解压 instantclient-basic-linux.x64-19.8.0.0.0dbru.zip

运行 mv instantclient_19_8 instantclient

添加tnsnames.ora/opt/instantclient/网络/管理员

运行 ldconfig -v

CMD ["php-fpm"]

曝光9000

# Insert following to .bash_profile or .profile of the User starting the php-fpm
export ORACLE_HOME=/usr/lib/oracle/client64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
export PATH=$PATH:$ORACLE_HOME/bin
export TNS_ADMIN=$ORACLE_HOME/network/admin
# Test to Ping Remote Db to be connected  by PHP 
tnsping <tns-name of remote DB - i.e. db12c.world>
 # restart here the php Engine 

你能检查一下吗

https://github.com/caffeinalab/php-fpm-oci8/blob/master/Dockerfile

这似乎创建了一个 p-fpm-oci8 docker 图像

的“wget”

wget -qO- https://raw.githubusercontent.com/caffeinalab/php-fpm-oci8/master/oracle/instantclient-basic-linux.x64-12.2.0.1.0.zip | bsdtar -xvf- -C /usr/local &&
wget -qO- https://raw.githubusercontent.com/caffeinalab/php-fpm-oci8/master/oracle/instantclient-sdk-linux.x64-12.2.0.1.0.zip | bsdtar -xvf- -C /usr/local &&
wget -qO- https://raw.githubusercontent.com/caffeinalab/php-fpm-oci8/master/oracle/instantclient-sqlplus-linux.x64-12.2.0.1.0.zip | bsdtar -xvf- -C /usr/local && \

将下载的即时客户端文件放入本地主机目录时可以删除

/usr/local

并提取它们 - 导致

/usr/local/instantcient_12_2 或 18、19c 等价物

必须调整 4 个“ln”命令以反映本地主机 instantclient 目录

instantclient 的 tnsnames.ora 可通过 VOLUME 命令从主机获得

------------最终解决方案------------(这与网络无关,我对文件做了一些更改,并且同时尝试了不同的数据库,所以这让我认为是不同的数据库解决了问题)

经过多次试验和错误,我想出了一个 Dockerfile,它创建了正确的文件配置并毫无问题地连接到数据库:

--Dockerfile:(使用 devilbox 镜像构建 php-fpm 7.4)

Final solution:

我修改了 php-fpm 的 Dockerfile 文件以添加新的即时客户端文件,而不是原始文件提供的文件。我无法让它与他们合作。我已经尝试过几次重建图像(docker-compose up --build),这是解决问题的文件:

来自 devilbox/php-fpm:7.4-作品

添加 instantclient.conf /etc/ld.so.conf.d/

WORKDIR /opt

运行 wget https://download.oracle.com/otn_software/linux/instantclient/19800/instantclient-sdk-linux.x64-19.8.0.0.0dbru.zip

运行 wget https://download.oracle.com/otn_software/linux/instantclient/19800/instantclient-sqlplus-linux.x64-19.8.0.0.0dbru.zip

运行 wget https://download.oracle.com/otn_software/linux/instantclient/19800/instantclient-basic-linux.x64-19.8.0.0.0dbru.zip

运行解压instantclient-sdk-linux.x64-19.8.0.0.0dbru.zip

运行解压instantclient-sqlplus-linux.x64-19.8.0.0.0dbru.zip

运行解压instantclient-basic-linux.x64-19.8.0.0.0dbru.zip

运行 mv instantclient_19_8 instantclient

添加 tnsnames.ora /opt/instantclient/network/admin

运行 ldconfig -v

CMD ["php-fpm"]

曝光9000

I got it!. It was a firewall issue. I launched a tcpdump capture session and there was nothing wrong with php-fpm, oci8 and instantclient libraries. The traffic was initiated but there was no response from the database. I made it work against a different database where this box has no firewall issues.

I now will try rebuilding the docker image so I can see what I have to manually add if any.

那是不正确的(防火墙是问题的根源)。重建 docker 文件告诉我哪里出错了。请参阅原始问题以获取解决方案。

这就是我建议使用 tnsping 的原因 - 不幸的是它没有包含在任何即时客户端文件中,这很遗憾 - 所以你必须从匹配 OS, bitsize 的常规客户端中获取它和甲骨文发布。作为解决方法,您可以将 SQL*Plus 包文件放入容器中并尝试与

这样的 foo 用户连接
sqlplus foo/foo@\<ip>:\<port>/\<dbname>

这应该会产生错误 - 如果

  • user/password 不匹配 - ORA-1017 即数据库和侦听器 运行
  • listener 运行 - ORA-1034 即 DB down
  • 侦听器关闭(无 return,或 TNS-Errors)