3

我已经建立了一个运行 Nginx 和 php-fpm 容器的 Laradock 环境。从 PHP 我想调用一个可执行文件:

<?php
    print exec('whoami'); // www-data
    echo "<br>";
    exec('/usr/local/bin/assimp version', $output, $returnValue);
    print $returnValue;   // 127
    echo "<br>";
    print_r($output);      // Array ( ) 
?>

返回值 127 对我来说听起来好像找不到文件......

但是当我使用用户“www-data”进入容器时,一切正常:

docker-compose exec --user www-data php-fpm bash
assimp version // -> valid info response

由于我不确定可执行文件是否必须放在“工作区”或 php-fpm 容器中,所以我尝试了两者,结果相同。将可执行文件放在 /var/www 目录中也无济于事。

可执行文件由 Dockerfile 添加:

USER www-data
COPY ./assimp /usr/local/bin/assimp
COPY ./libassimp.so.4.1.0 /usr/local/lib/libassimp.so.4.1.0
RUN ln -s /usr/local/lib/libassimp.so.4.1.0 /usr/local/lib/libassimp.so
RUN chmod 777 /usr/local/bin/assimp
RUN echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc
RUN echo 'export LD_LIBRARY_PATH=/usr/local/lib' >> ~/.bashrc

任何想法如何解决此问题或如何继续调试?提前致谢!

4

1 回答 1

3

返回代码 127 是针对未找到的文件,但不一定是您正在执行的文件。这里你设置了一些库,但是当docker容器被执行时,你bashrc的没有被读取,因此,动态加载器(/lib/ld-linux[...].so)没有找到你的libassimp.so.4.1.0,因此进程返回127。

您应该使用 Dockerfile 的指令设置您的PATHand ,如下所示:LD_LIBRARY_PATHENV

ENV PATH="/usr/local/bin:${PATH}" ENV LD_LIBRARY_PATH=/usr/local/lib

于 2018-11-27T15:15:09.583 回答