我试图用这个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
但是我得到了一个配置错误:
正在检查默认路径中的V8文件。。。未找到
configure:error:请重新安装v8分发错误:`/tmp/pear/temp/v8js/configure--with php config=/usr/local/bin/php config--with-v8js'失败命令'/bin/sh-c pecl install v8js'返回非零代码: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 FROM Debian Buster上安装V8JS?
编辑
Dockerfile来自@saulotoledo答案作品:(
建筑图像大约需要60-90分钟,图像大小为5.47GB,与基本图像相比(FROM(7.3-cli-buster 367MB
要使用V8JS构建Dockerfile php,请从@saulotoledo answer复制代码并将其粘贴到名为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运行JS作为oneliner。
通常你不需要请参阅官方PHP文档示例
有人知道是否可以安装并启用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
不够。由于这不起作用,您需要编译它,因为这是一个需求。
也就是说,这个链接可能会有所帮助。但这里提供了官方的汇编说明。经过几次测试后,我注意到您需要将libtinfo5
(为了安全起见,可能还有libtinfo-dev
,但您可以尝试不使用它(添加到apt-get install
中,否则说明中的忍者构建将失败。
在Dockerfile中使用该编译指令后,V8将正确编译。在那之后,您在安装pecl时仍然会遇到一些麻烦。不幸的是,我现在不得不停止调查这个问题,汇编需要一些时间。但是,以下链接可能会帮助您解决问题:
- 如果你仍然在用忍者编译时遇到问题,请使用这个
- 这一个提供了另一个用于编译V8的Dockerfile,但基本映像不同,需要进行一些调整
我希望它能有所帮助。如果您有一个工作的Dockerfile,请稍后与我们分享。如果我稍后有时间调查它,并且我有一些进展,我会编辑我的答案。
多亏了saulotoledo,我创建了一个示例图像,它使用950MB与398MB的基本图像(php:7.3-cli-buster(
它也适用于PHP FPM,只需更改FROM php:7.3-cli-buster
到FROM php:7.3-fpm-buster
,如果您想要FPM版本。
Dockerfile
FROM php:7.3-cli-buster
ENV V8_VERSION=7.4.288.21
# php:7.3-cli-buster 398MB
RUN apt-get update -y --fix-missing && apt-get upgrade -y;
# Install required CLI tools
RUN apt-get install -y --no-install-recommends
libtinfo5 libtinfo-dev
build-essential
curl
git
libglib2.0-dev
libxml2
python
patchelf
# Install V8, PHP's V8Js
RUN 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
&& 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/
&& for A in /opt/v8/lib/*.so; do patchelf --set-rpath '$ORIGIN' $A;done
&& 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
&& docker-php-ext-enable v8js
&& rm -rf "/tmp/v8"
&& rm -rf "/tmp/depot_tools"
# Image size after removing source files 950MB
这在不编译v8的情况下工作,速度非常快。使用发行版打包的nodejs库。您可以使用当前的官方php docker镜像
RUN apt-get install -y libnode-dev
&& cp -s /usr/lib/x86_64-linux-gnu/libv8* /usr/local/lib/
&& cp -rs /usr/include/node/* /usr/local/include/
&& pecl install v8js
&& echo "extension=v8js.so" > /usr/local/etc/php/conf.d/v8js.so