故事是这样的:
公司采购了一套商城源码,使用的是 TP5,同事先行,用宝塔部署到生产环境,运行正常。后面我忙完手里的项目,也加入其中,我本地使用的是 docker
当我部署好开始运行时,发现 在登录界面时 图形验证码 报错 500
然后我绞尽脑汁的在想,会是什么问题呢?
终于,想到了,GD 库,我看了一下 php 模块,确实,没有 GD 库,所以,就有了如下的文章。
进入 docker 容器后,我们可以先查看一下 php 模块
发现,确实没有 gd 库。
那好吧,咱们开始安装 gd 库!
第一步:安装依赖
apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package libfreetype6-dev
E: Unable to locate package libjpeg62-turbo-dev
E: Unable to locate package libpng-dev
运行时,出现了上面这些信息,意思就是说,无法定位到这些包
解决方案是:我们先进行更新下载安装软件包命令
第二步:更新下载安装软件包命令
apt-get update
因为环境的原因,所以如果 同学一次性成功那是最好,如果出现了我这样的问题,那就要再多出几个步骤了。。
W: Failed to fetch http://deb.debian.org/debian/dists/bullseye/InRelease Temporary failure resolving 'deb.debian.org'
W: Some index files failed to download. They have been ignored, or old ones used instead.
当出现上面这些警告,那就是说,我们更新失败。。
是什么原因呢?镜像,我们要切换成我们国内的,这里我们示例 阿里云镜像。
cat /etc/resolv.conf
执行上面的命令,会输出:
nameserver 127.0.0.11
options ndots:0
我们就需要在这个文件中,加入 阿里云的镜像
vim /etc/resolv.conf
bash: vim: command not found
如果哈,如果出现上面这个 "找不到命令",那么恭喜,请去看我另外一篇文章吧:
偷偷的告诉你们一个秘密:因为我们 apt-get update 出现了异常,所以上面这篇文章,最后也是执行失败。。。。
那怎么办?无解啦!!!
这时候,我突然想到,咱们不是可以在 母机 中,直接复制文件到容器里的嘛,那么我们就:
在我们本地,先创建一个文件,内容写好,然后复制到容器里替换掉就可以啦。
首先,退出容器,在我们本地创建一个文件:resolv.conf
内容为:
nameserver 127.0.0.11
options ndots:0
nameserver 223.5.5.5
nameserver 223.6.6.6
然后执行下面这段命令:
docker cp resolv.conf 容器名称:/tmp
注意事项:
- resolv.conf,文件的路径,我这里直接使用,是因为我命令行 是这个文件一样的路径,如果你的命令行和这个文件不在同一个目录下,你就得这样,参考:/d/docker/resolv.conf
- 容器名称,得改成你的"容器名称",或者"容器ID"
然后我们再进入容器,去到 /tmp 目录
cd /tmp/
ls
就能看到 resolv.conf 文件存在这里了,然后再看看内容:
cat resolv.conf
nameserver 127.0.0.11
options ndots:0nameserver 223.5.5.5
nameserver 223.6.6.6
输出的内容,和我们本地是一样的,那么ok 继续!!
我们需要将这个文件替换原来的,执行下面这个命令:
cp resolv.conf /etc/resolv.conf
替换后,我们再查看一下试试:
cat /etc/resolv.conf
输出的内容,如果和上面是一样的,那么我们就可以回到最开始的命令
再执行试一下:(这次过程可能稍微较长了,也可能是因为网络原因,我这边更新蛮久的)
apt-get update
Reading package lists... Done
最后输出以上内容,那就成功了,太感动了。
这时候,我们就可以退回第一步,安装依赖!
apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev
最后,只要没输出 ERR 这类错误,或者 W 开头的警告,就代表成功!
第三步:安装 GD 库
然后我们再回到第一步中,执行安装 GD 库:
docker-php-ext-install gd
执行上面之后,无异常,也就代表成功!
然后我们再看一下 php 的模块:
太好了,这次有 GD库了
过程太繁琐了,不过结果是好的!
退出容器,重启容器
我们输出一下 phpinfo() 查看 GD
nice,存在!
然后这时候又出现问题,人家这套商城代码,还是会 报错,然后我就找到异常,毕竟 前端控制台里,就只给了一个 500
我是完全不懂,为什么错误,然后我就找到了这个执行的地方
哼!没有这个方法 imagettftext()
翻阅各类资料,最后找到了。
我们重新进入容器,安装一些扩展
apt install libjpeg62-turbo-dev libfreetype6-dev -y
su -c "docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg"
su -c "docker-php-ext-install gd"
依次执行上面的命令即可。
再退出容器,重启容器
输出 phpinfo() 看看
可以看到,和上一次相比,多了几个。
然后我们再尝试一下,这次是否还有问题
某一次又接触到 fastAdmin 框架,也使用了验证码,我按照上面的流程时,但一直无法使用,且会报错:
Call to undefined function think\captcha\imagettftext()
要解决这个问题,需要在容器里,执行以下命令安装GD库扩展:
apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && docker-php-ext-install -j$(nproc) gd