Laradock执行docker compose up时Tokenizer编译错误求助
Laradock构建PHP镜像时tokenizer扩展编译失败解决方法
错误信息
153.2 creating libtool 153.3 appending configuration tag "CXX" to libtool 153.4 configure: patching config.h.in 153.4 configure: creating ./config.status 153.4 config.status: creating config.h 153.5 make: *** No rule to make target '/usr/src/php/ext/tokenizer/Zend/zend_language_parser.y', needed by '/usr/src/php/ext/tokenizer/Zend/zend_language_parser.c'. Stop. ------ failed to solve: process "/bin/sh -c pecl channel-update pecl.php.net; docker-php-ext-install mysqli mbstring pdo pdo_mysql xml pcntl; if [ $(php -r \"echo PHP_MAJOR_VERSION;\") = \"8\" ] && [ $(php -r \"echo PHP_MINOR_VERSION;\") = \"1\" ]; then php -m | grep -q 'tokenizer'; else docker-php-ext-install tokenizer; fi" did not complete successfully: exit code: 2
问题原因
PHP 8.2及以上版本中,tokenizer扩展已成为内置扩展,无需通过docker-php-ext-install手动安装。但Laradock原有脚本仅跳过了PHP 8.1版本的tokenizer安装,在PHP 8.2+版本仍尝试执行安装命令,导致编译时找不到对应源码文件(路径结构已变化)。
解决步骤
- 打开Laradock目录下的PHP Dockerfile,路径一般为
laradock/php/Dockerfile - 找到安装扩展的命令块,替换原有的tokenizer判断逻辑:
原代码:
if [ $(php -r \"echo PHP_MAJOR_VERSION;\") = \"8\" ] && [ $(php -r \"echo PHP_MINOR_VERSION;\") = \"1\" ]; then php -m | grep -q 'tokenizer'; else docker-php-ext-install tokenizer; fi
替换为:
# PHP 8.2及以上版本tokenizer为内置扩展,无需手动安装 PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;") if [ $(echo "$PHP_VERSION < 8.2" | bc) -eq 1 ]; then docker-php-ext-install tokenizer; else php -m | grep -q 'tokenizer'; fi
- 清理Docker构建缓存,避免旧缓存影响:
docker builder prune -af
- 重新启动Laradock容器:
docker-compose up -d
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

