You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker构建失败:pecl安装memcached时提示缺少libmemcached依赖

Docker构建失败:pecl安装memcached时提示缺少libmemcached依赖

兄弟我太懂这种啥都没改突然崩了的痛苦了!昨天还好好的,今天构建就报找不到libmemcached,明明Dockerfile里已经装了依赖,这种“无差别突然炸锅”的问题十有八九是外部依赖环境变了——要么是基础镜像偷偷更新了,要么是软件源里的libmemcached版本换了,甚至可能是pecl上的memcached扩展包更新了检测逻辑,导致原来的安装方式不兼容了。

先给你几个针对性的解决办法,按从易到难的顺序试:

1. 给pecl安装命令明确指定libmemcached路径

你之前试过指定/usr/include/libmemcached,但其实pecl的配置脚本需要的是根前缀路径(头文件在/usr/include、库文件在/usr/lib,脚本会自动在这个前缀下找对应目录)。修改后的RUN命令如下:

RUN pecl install memcache-$MEMCACHE_VERSION && \
    pecl install memcached-$MEMCACHED_VERSION --with-libmemcached-dir=/usr && \
    pecl install imagick

这个方法最简单,先试试能不能直接解决问题。

2. 锁定libmemcached相关包的版本

如果上面的方法没用,那大概率是软件源里的libmemcached版本更新了,和pecl的memcached扩展不兼容。这时候需要把依赖包的版本固定下来:

  • 先找到之前能正常构建的版本号:如果有之前成功的镜像,进去执行dpkg -l | grep libmemcached就能看到;也可以去对应系统的软件快照站查历史版本(比如Debian Snapshot)。
  • 修改apt安装命令,给每个包加上具体版本号,比如Debian Bullseye的示例:
RUN apt-get update && apt-get install -y --no-install-recommends \
    zlib1g-dev=1:1.2.11.dfsg-2+deb11u2 \
    zlib1g=1:1.2.11.dfsg-2+deb11u2 \
    libmemcached11=1.0.18-4.2 \
    libmemcachedutil2=1.0.18-4.2 \
    libmemcached-dev=1.0.18-4.2 \
    libmagickwand-dev=8:6.9.11.60+dfsg-1.3+deb11u10

注意版本号要根据你实际用的基础镜像调整,Ubuntu和Debian的版本号差异很大。

3. 固定基础镜像的具体Tag

为了避免以后再出现这种“莫名炸锅”的情况,建议把Dockerfile里的基础镜像从模糊的Tag(比如php:8.2-fpm)改成具体的系统Tag,比如:

FROM php:8.2-fpm-bullseye

这样每次构建都会用同一个固定版本的基础镜像,不会因为上游镜像更新而悄悄改变环境。

你之前手动进容器确认libmemcached存在但还是报错,本质就是pecl的配置脚本找依赖的逻辑变了,或者新的libmemcached版本的文件结构和之前不一样,导致脚本识别不出来。

备注:内容来源于stack exchange,提问作者IT-Girl

火山引擎 最新活动