微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

docker容器中带有php-fpm的ORA-28547

如何解决docker容器中带有php-fpm的ORA-28547

我有一个工作的PHP-fpm docker容器,充当Nginx前端的PHP后端。我的意思是,它可以按预期方式在浏览器中呈现PHPinfo输出。 我的PHP-fpm容器是由devilBox docker repo的PHP-fpm-7.4产品生产的。它具有OCI8启用功能

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

我所做的:

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库。创建修改后的dockerfile以在创建容器时执行此操作。

修改PHP-fpm的Dockerfile文件,以添加新的即时客户端文件,而不是原始文件提供的文件。我无法使其与他们合作。我已经尝试过几次重建映像(docker-compose up --build),这是完成技巧的文件

FROM devilBox / PHP-fpm:7.4-工作

#instantclient.conf内容:/ opt / instantclient RUN 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 / network / admin

运行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码头工人镜像

“ 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),这是完成技巧的文件:

FROM devilbox / php-fpm:7.4-工作

ADD 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

,

我明白了!这是防火墙问题。我启动了一个tcpdump捕获 会话,并且php-fpm,oci8和 InstantClient库。流量已启动,但没有 来自数据库的响应。我让它与另一个不同 此框没有防火墙问题的数据库。

我现在将尝试重建docker映像,以便可以看到需要执行的操作 手动添加(如果有)。

那是不正确的(防火墙是问题的根源)。重建docker文件向我展示了我的错误所在。请参阅原始问题以获取解决方案。

,

这就是为什么我建议使用tnsping的原因-遗憾的是,它没有包含在任何即时客户端文件中,因此,您必须从具有匹配OS,bitsize和Oracle版本的常规客户端中进行选择。解决方法是,您可以将SQL * Plus软件包文件放入容器中,并尝试与foo用户(如

)连接
sqlplus foo/foo@\<ip>:\<port>/\<dbname>

应该会产生错误-如果

  • 用户/密码不匹配-ORA-1017,即数据库和监听器正在运行
  • 监听器正在运行-ORA-1034,即数据库关闭
  • 倾听者(无回报,或TNS错误)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?