php:7.3-fpm-alpine3.13/3.14安装readline扩展失败求解决方案
问题原因
Alpine Linux 3.13及以上版本自带的libedit-dev库移除了对GNU Readline几个冷门变量的兼容,而PHP 7.3版本的readline扩展源码默认引用了这几个变量(rl_mark、rl_pending_input、rl_completion_suppress_append),最终导致编译报错。
可行解决方案
根据你的使用场景可以任选以下任意一种方案解决:
方案1:使用基于Alpine 3.12的PHP镜像(最省心)
直接将基础镜像更换为php:7.3-fpm-alpine3.12,该版本镜像携带的libedit版本与PHP7.3的readline扩展完全兼容,无需修改其他配置:
FROM php:7.3-fpm-alpine3.12 RUN apk add --update --no-cache libedit-dev RUN docker-php-ext-install -j$(nproc) readline
方案2:给PHP readline扩展打补丁(兼容高版本Alpine)
如果必须使用Alpine 3.13+版本的镜像,可以在安装扩展前修改readline扩展的源码,删除对不存在变量的引用。这三个变量仅用于readline_info()函数的返回值,修改后不影响命令行交互、历史记录、补全等readline核心功能,绝大多数业务场景都可以正常使用:
FROM php:7.3-fpm-alpine RUN apk add --update --no-cache libedit-dev # 拉取PHP扩展源码 RUN docker-php-source extract # 注释源码中对不存在变量的引用 RUN sed -i 's/^.*rl_mark.*$/\/* & *\//' /usr/src/php/ext/readline/readline.c \ && sed -i 's/^.*rl_pending_input.*$/\/* & *\//' /usr/src/php/ext/readline/readline.c \ && sed -i 's/^.*rl_completion_suppress_append.*$/\/* & *\//' /usr/src/php/ext/readline/readline.c # 编译安装扩展 RUN docker-php-ext-install -j$(nproc) readline # 清理源码冗余 RUN docker-php-source delete
方案3:编译安装GNU Readline替代libedit(保留完整功能)
如果需要完整保留readline扩展的所有功能,可以不用Alpine自带的libedit,自行编译安装原生GNU Readline库:
FROM php:7.3-fpm-alpine RUN apk add --update --no-cache build-base curl # 下载编译GNU Readline库 RUN curl -fsSL https://ftp.gnu.org/gnu/readline/readline-8.2.tar.gz | tar xz \ && cd readline-8.2 \ && ./configure --prefix=/usr/local \ && make -j$(nproc) \ && make install \ && cd .. && rm -rf readline-8.2 # 配置PHP readline扩展使用刚安装的GNU Readline RUN docker-php-ext-configure readline --with-readline=/usr/local RUN docker-php-ext-install -j$(nproc) readline
内容的提问来源于stack exchange,提问作者Stefaan Neyts
相关产品推荐
相关产品推荐

