如何解决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
运行解压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
运行解压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 举报,一经查实,本站将立刻删除。