PHP Docker 安装 pecl V8JS (Debian Buster)

标签 php docker configuration debian v8js

我尝试使用此 Dockerfile 安装 V8JS

FROM php:7.3-cli-buster

RUN apt-get update -y --fix-missing && apt-get upgrade -y;

# Install v8js
RUN apt-get install -y libv8-dev
RUN pecl install v8js
RUN docker-php-ext-enable v8js

但我遇到配置错误:

checking for V8 files in default path... not found

configure: error: Please reinstall the v8 distribution ERROR: `/tmp/pear/temp/v8js/configure --with-php-config=/usr/local/bin/php-config --with-v8js' failed The command '/bin/sh -c pecl install v8js' returned a non-zero code: 1

完整的 cli 输出:

Sending build context to Docker daemon   35.6MB
Step 1/5 : FROM php:7.3-cli-buster
 ---> c7ff0bf4f6fb
Step 2/5 : RUN apt-get update -y --fix-missing && apt-get upgrade -y;
 ---> Using cache
 ---> e151d6e061d2
Step 3/5 : RUN apt-get install -y libv8-dev
 ---> Using cache
 ---> fe35f48dd8cf
Step 4/5 : RUN pecl install v8js
 ---> Running in d9f4ba184d81
downloading v8js-2.1.1.tgz ...
Starting to download v8js-2.1.1.tgz (101,888 bytes)
.......................done: 101,888 bytes
28 source files, building
running: phpize
Configuring for:
PHP Api Version:         20180731
Zend Module Api No:      20180731
Zend Extension Api No:   320180731
Please provide the installation prefix of libv8 [autodetect] : building in /tmp/pear/temp/pear-build-defaultuserEVh9Nq/v8js-2.1.1
running: /tmp/pear/temp/v8js/configure --with-php-config=/usr/local/bin/php-config --with-v8js
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for a sed that does not truncate output... /bin/sed
checking for cc... cc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether cc accepts -g... yes
checking for cc option to accept ISO C89... none needed
checking how to run the C preprocessor... cc -E
checking for icc... no
checking for suncc... no
checking whether cc understands -c and -o together... yes
checking for system library directory... lib
checking if compiler supports -R... no
checking if compiler supports -Wl,-rpath,... yes
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
checking for PHP prefix... /usr/local
checking for PHP includes... -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -I/usr/local/include/php/ext/date/lib
checking for PHP extension directory... /usr/local/lib/php/extensions/no-debug-non-zts-20180731
checking for PHP installed headers prefix... /usr/local/include/php
checking if debug is enabled... no
checking if zts is enabled... no
checking for re2c... re2c
checking for re2c version... 1.1.1 (ok)
checking for gawk... no
checking for nawk... nawk
checking if nawk is broken... no
checking for V8 Javascript Engine... yes, shared
checking for V8 files in default path... not found
configure: error: Please reinstall the v8 distribution
ERROR: `/tmp/pear/temp/v8js/configure --with-php-config=/usr/local/bin/php-config --with-v8js' failed
The command '/bin/sh -c pecl install v8js' returned a non-zero code: 1

如何解决配置错误(我猜是因为缺少 V8 文件的路径)并在 PHP Docker 上从 Debian Buster 安装 V8JS?

编辑

@saulotoledo 的 Dockerfile 答案有效:)

构建镜像大约需要 60-90 分钟,镜像大小为 5.47GB,而基础镜像 (FROM) 7.3-cli-buster 为 367MB​​

要使用 V8JS 构建 Dockerfile php,请复制 @saulotoledo 答案中的代码并将其粘贴到名为 Dockerfile 的文件中

然后在同一目录中运行以下命令:

docker build --tag "test-php-js" .

然后以这种方式运行容器:

docker run -it --rm --entrypoint="" --name="php-v8js" test-php-js /bin/sh

您应该登录到 php-cli 的终端,输入:

php -m

您应该会看到已启用的扩展列表,其中包括 v8js

类型:

php --ri v8js

查看一些详细信息,例如:

V8 Javascript Engine => enabled
V8 Engine Compiled Version => 7.4.288.21
V8 Engine Linked Version => 7.4.288.21
Version => 2.1.1

现在是你们一直在等待的樱桃部分 - 输入:

php -r "(new V8Js())->executeString(\"print('Hello' + ' from JS ' + 'World!')\", 'basic.js');";

查看 php 在 V8JS 支持下运行 js 代码:D

Hello from JS World!

请注意,我需要在 php -r 命令的每个 JS 双引号 " 前面添加额外的反斜杠 \。但这仅是由于在 cli 模式下从 php 作为 oneliner 运行 JS。

通常情况下你不需要这个 See an official PHP documentation example

有谁知道是否可以安装并启用 V8JS 扩展,而无需从源代码构建它,而是使用 Debian Buster 包和 PECL,就像我一开始尝试的那样?

最佳答案

编辑: 这应该可以解决您的问题(请注意,我正在手动编译它):

FROM php:7.3-cli-buster
ENV V8_VERSION=7.4.288.21

RUN apt-get update -y --fix-missing && apt-get upgrade -y;

# Install v8js (see https://github.com/phpv8/v8js/blob/php7/README.Linux.md)
RUN apt-get install -y --no-install-recommends \
    libtinfo5 libtinfo-dev \
    build-essential \
    curl \
    git \
    libglib2.0-dev \
    libxml2 \
    python \
    patchelf \
    && cd /tmp \
    \
    && git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git --progress --verbose \
    && export PATH="$PATH:/tmp/depot_tools" \
    \
    && fetch v8 \
    && cd v8 \
    && git checkout $V8_VERSION \
    && gclient sync \
    \
    && tools/dev/v8gen.py -vv x64.release -- is_component_build=true use_custom_libcxx=false

RUN export PATH="$PATH:/tmp/depot_tools" \
    && cd /tmp/v8 \
    && ninja -C out.gn/x64.release/ \
    && mkdir -p /opt/v8/lib && mkdir -p /opt/v8/include \
    && cp out.gn/x64.release/lib*.so out.gn/x64.release/*_blob.bin out.gn/x64.release/icudtl.dat /opt/v8/lib/ \
    && cp -R include/* /opt/v8/include/ \
    && apt-get install patchelf \
    && for A in /opt/v8/lib/*.so; do patchelf --set-rpath '$ORIGIN' $A;done

# Install php-v8js
RUN cd /tmp \
    && git clone https://github.com/phpv8/v8js.git \
    && cd v8js \
    && phpize \
    && ./configure --with-v8js=/opt/v8 LDFLAGS="-lstdc++" \
    && make \
    && make test \
    && make install

RUN docker-php-ext-enable v8js

旧答案:

我相信你需要手动编译V8。我还不确定为什么 libv8-dev 还不够。由于这不起作用,您需要编译它,因为 it is a requirement .

也就是说,this link可能会有帮助。但官方给出了编译说明here 。经过几次测试后,我注意到您需要将 libtinfo5 添加到您的 apt -get install,否则说明中的ninja构建会失败。

在 Dockerfile 中使用该编译指令后,V8 将正确编译。之后,您在安装 pecl 时仍然会遇到一些问题。不幸的是我现在不得不停止调查这个问题,编译需要一些时间。但是,以下链接可能会帮助您解决问题:

  • This one如果您在使用 ninja 编译时仍然遇到问题
  • This one提供了另一个用于编译 V8 的 Dockerfile,但基础镜像不同,需要进行一些调整。

希望对您有帮助。如果您设法拥有一个可用的 Dockerfile,请稍后与我们分享。如果我稍后有时间进行调查并且取得了一些进展,我将编辑我的答案。

关于PHP Docker 安装 pecl V8JS (Debian Buster),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60822501/

相关文章:

javascript - 如何将javascript变量值分配给php变量

php - Laravel 的 mysql 嵌套选择查询的 Eloquent 关系

php - 显示斯拉夫字符

php - spatie/pdf-to-image 1.8.2 需要 ext-imagick composer 安装时出错

java - docker 中 Redis 设置集群模式的问题(Windows 7)

docker - 带有 Linux 容器的 Docker for Windows 可以在 VMware vSphere Windows 10 虚拟机上运行吗?

javascript - 允许用户通过 json 对象配置设置

asp.net-mvc - 任何方式配置来配置visual studio mvc 构建 View Release模式

python - 在 Python 中设置配置文件的最佳方法是什么

docker - 我可以通过内部网址访问docker启动的服务吗?