php:8.2-fpm Docker镜像中IonCube Loader加载失败如何解决?
问题背景
我准备购买Setasign的FPDI-Parser完整版许可,先试用套件,但加载试用版专属工具时页面报错:
Script error: the Ioncube Loader for PHP needs to be installed. The ionCube Loader is the industry standard PHP extension for running protected PHP code, and can usually be added easily to a PHP installation. For Loaders please visit get-loader.ioncube.com and for an instructional video please see http://ioncu.be/LV
尝试的安装步骤
我使用php:8.2-fpm Docker镜像,在Dockerfile中添加以下命令安装ionCube Loader:
RUN curl -o ioncube.tar.gz http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz \ && tar -xvvzf ioncube.tar.gz \ && mv ioncube/ioncube_loader_lin_8.2.so `php-config --extension-dir` \ && rm -Rf ioncube.tar.gz ioncube \ && docker-php-ext-enable ioncube_loader_lin_8.2
错误现象
执行docker-compose --build up后,运行php -v输出:
Warning: Failed loading Zend extension 'ioncube_loader_lin_8.2' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20220829/ioncube_loader_lin_8.2 (/usr/local/lib/php/extensions/no-debug-non-zts-20220829/ioncube_loader_lin_8.2: cannot open shared object file: No such file or directory), /usr/local/lib/php/extensions/no-debug-non-zts-20220829/ioncube_loader_lin_8.2.so (/usr/local/lib/php/extensions/no-debug-non-zts-20220829/ioncube_loader_lin_8.2.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 PHP 8.2.21 (cli) (built: Jul 23 2024 07:02:30) (NTS) Copyright (c) The PHP Group Zend Engine v4.2.21, Copyright (c) Zend Technologies
文件检查结果
文件实际存在,执行ls -la /usr/local/lib/php/extensions/no-debug-non-zts-20220829/ioncube_loader_lin_8.2.so结果:
-rw-rw-r-- 1 507 507 1761720 Jul 2 09:29 /usr/local/lib/php/extensions/no-debug-non-zts-20220829/ioncube_loader_lin_8.2.so
执行file /usr/local/lib/php/extensions/no-debug-non-zts-20220829/ioncube_loader_lin_8.2.so结果:
/usr/local/lib/php/extensions/no-debug-non-zts-20220829/ioncube_loader_lin_8.2.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped
执行ldd /usr/local/lib/php/extensions/no-debug-non-zts-20220829/ioncube_loader_lin_8.2.so结果:
not a dynamic executable
我搞不懂为什么文件存在却加载失败,求解决思路,需要更多信息请告知。
补充信息
Dockerfile完整内容
FROM php:8.2-fpm RUN apt-get update && apt-get install -y libmcrypt-dev zlib1g-dev libpng-dev libzip-dev\ mariadb-client libmagickwand-dev --no-install-recommends \ && pecl install imagick \ && pecl install apcu \ && pecl install mcrypt \ && docker-php-ext-enable imagick apcu \ && docker-php-ext-enable mcrypt \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-install zip \ && docker-php-ext-install gd \ && docker-php-ext-enable gd \ && docker-php-ext-enable zip RUN curl -o ioncube.tar.gz http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz \ && tar -xvvzf ioncube.tar.gz \ && mv ioncube/ioncube_loader_lin_8.2.so `php-config --extension-dir` \ && rm -Rf ioncube.tar.gz ioncube \ && docker-php-ext-enable ioncube_loader_lin_8.2 WORKDIR /var/www COPY --from=composer /usr/bin/composer /usr/bin/composer
docker-compose build --progress plain输出
0 building with "desktop-linux" instance using docker driver #1 [app internal] load .dockerignore #1 transferring context: 2B done #1 DONE 0.0s #2 [app internal] load build definition from app.dockerfile #2 transferring dockerfile: 3.58kB done #2 DONE 0.0s #3 [app internal] load metadata for docker.io/library/composer:latest #3 DONE 2.2s #4 [app internal] load metadata for docker.io/library/php:8.2-fpm #4 DONE 2.2s #5 [app stage-0 1/5] FROM docker.io/library/php:8.2-fpm@sha256:f40ee21ed5b42d0ae6ff95aaa7e619a8701d96aa754eafc8fc7870eb455ce0eb #5 resolve docker.io/library/php:8.2-fpm@sha256:f40ee21ed5b42d0ae6ff95aaa7e619a8701d96aa754eafc8fc7870eb455ce0eb done #5 DONE 0.0s #6 [app] FROM docker.io/library/composer@sha256:b7e5711118e4be186ef635d841a23325d78eae9de59503074a5b588bc04a0407 #6 resolve docker.io/library/composer@sha256:b7e5711118e4be186ef635d841a23325d78eae9de59503074a5b588bc04a0407 0.0s done #6 DONE 0.0s #7 [app stage-0 4/5] WORKDIR /var/www #7 CACHED #8 [app stage-0 2/5] RUN apt-get update && apt-get install -y libmcrypt-dev zlib1g-dev libpng-dev libzip-dev mariadb-client libmagickwand-dev --no-install-recommends && pecl install imagick && pecl install apcu && pecl install mcrypt && docker-php-ext-enable imagick apcu && docker-php-ext-enable mcrypt && docker-php-ext-install pdo_mysql && docker-php-ext-install zip && docker-php-ext-install gd && docker-php-ext-enable gd && docker-php-ext-enable zip #8 CACHED #9 [app stage-0 3/5] RUN curl -o ioncube.tar.gz http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz && tar -xvvzf ioncube.tar.gz && mv ioncube/ioncube_loader_lin_8.2.so `php-config --extension-dir` && rm -Rf ioncube.tar.gz ioncube && docker-php-ext-enable ioncube_loader_lin_8.2 #9 CACHED #10 [app stage-0 5/5] COPY --from=composer /usr/bin/composer /usr/bin/composer #10 CACHED #11 [app] exporting to image #11 exporting layers done #11 writing image sha256:79082b1d1fa77aea678606d39de90314a5afcbc1005a3f39c85e8588458aa580 done #11 naming to docker.io/library/aicc-comm-laravel-9-app done #11 DONE 0.0s #12 [web internal] load .dockerignore #12 transferring context: 2B done #12 DONE 0.0s #13 [web internal] load build definition from web.dockerfile #13 transferring dockerfile: 104B done #13 DONE 0.0s #14 [web internal] load metadata for docker.io/library/nginx:1.23 #14 DONE 1.4s #15 [web 1/2] FROM docker.io/library/nginx:1.23@sha256:f5747a42e3adcb3168049d63278d7251d91185bb5111d2563d58729a5c9179b0 #15 DONE 0.0s #16 [web internal] load build context #16 transferring context: 69B done #16 DONE 0.0s #17 [web 2/2] ADD vhost.conf /etc/nginx/conf.d/default.conf #17 CACHED #18 [web] exporting to image #18 exporting layers done #18 writing image sha256:4552dcf435c8f139caee192002dda3984eed1db65cdd0cba95751a77c6a286f2 done #18 naming to docker.io/library/aicc-comm-laravel-9-web done #18 DONE 0.0s
内容的提问来源于stack exchange,提问作者Brendan O Connell

