docker phalcon
前言
Docker 并不是万能的。
如果你在使用docker部署phalcon的运行环境,或者其他需要在docker容器里编译的东西,那么这篇文章或许对你有所启发。
构思
公司有一个很老的验证项目,使用的是phalcon开发,这几天交给我个任务让我在docker里部署一下他的运行环境,达到“一次部署,永久运行”的结果。
先是大致看了一下代码,了解一下phalcon的机制,发现要使用phalcon的话需要针对性的编译他的扩展,于是决定在centos里进行部署,最后打包成tar。
经过
下载docker,使用centos7作为基础镜像。
代码语言:javascript复制1. 部署php7的运行环境以及开发工具包
2. 下载最新的phalcon源码
3. 进入bulid目录编译扩展
4. 重启web服务器
运行ok!生成镜像!打包!换个环境测试!
这里要补充一句,我的docker部署在虚拟机上,所有的操作都在虚拟机实现,于是很方便开启一台新的虚拟机。
新开一台虚拟机(centos MiNi)测试也正常运行,ok,到公司服务器准备部署!
问题
我明明用的docker,按理说,与世隔绝的环境,应该不会出现意外才对,但就是出了问题。
错误日志如下: AH00052: child pid xxx exit signal Illegal instruction (4)
我做了两套docker容器,分别跑两个项目,一个是这个,另一个是laravel,laravel的项目正常跑通,唯独这个phalcon。
问题出在哪里? 我的机器可以跑,我装了2台虚拟机都可以跑通,唯独到了公司服务器上不行,难道是公司服务器有问题?但是laravel项目可以正常访问啊!
难道是镜像问题?可是我的机器全都正常啊!
解决
排查过程太复杂就不记录了。
最后发现问题出在了phalcon扩展身上,我是在docker里面的php环境下编译的扩展,但是我的机器是i5的CPU,公司服务器是E5的CPU,问题就在这,到公司服务器上重新编译一下扩展,问题被解决。
结论
如果你要在docker容器里编译东西,记得确保运行docker的环境是一致的;报错的话不妨重新编译一下,也许问题就能得到解决。