开放的编程资料库

当前位置:我爱分享网 > Python教程 > 正文

为基于 Alpine 的 PHP Docker 镜像构建可用的 ext-tidy

我一直致力于构建用于测试目的的PHPDocker图像,并可能提供包含Swoole扩展的图像。这通常是直截了当的,因为官方PHP图像有详细的文档记录。

本周,我决定看看我是否可以构建基于Alpine的图像,因为它们可以大大减小最终图像的大小。我遇到了一个问题。

我使用的其中一个测试平台使用zend-feed构建RSS和Atom提要。当我尝试其中一个图像时,我开始遇到如下故障:

PHP Warning:  DOMDocument::loadXML(): xmlParseEntityRef: no name in Entity, line: 167 in /var/www/vendor/zendframework/zend-feed/src/Writer/Renderer/Entry/Atom.php on line 404
PHP Fatal error:  Uncaught TypeError: Argument 1 passed to DOMDocument::importNode() must be an instance of DOMNode, null given in /var/www/vendor/zendframework/zend-feed/src/Writer/Renderer/Entry/Atom.php:371
Stack trace:
#0 /var/www/vendor/zendframework/zend-feed/src/Writer/Renderer/Entry/Atom.php(371): DOMDocument->importNode(NULL, 1)
#1 /var/www/vendor/zendframework/zend-feed/src/Writer/Renderer/Entry/Atom.php(53): Zend\Feed\Writer\Renderer\Entry\Atom->_setContent(Object(DOMDocument), Object(DOMElement))
#2 /var/www/vendor/zendframework/zend-feed/src/Writer/Renderer/Feed/Atom.php(91): Zend\Feed\Writer\Renderer\Entry\Atom->render()
#3 /var/www/vendor/zendframework/zend-feed/src/Writer/Feed.php(237): Zend\Feed\Writer\Renderer\Feed\Atom->render()
#4 /var/www/src/Blog/Console/FeedGenerator.php(209): Zend\Feed\Writer\Feed->export('Atom')

在最初的搜索中,由于libxml2版本,这似乎是一个问题,所以我陷入困境,试图找到一个较旧的libxml2版本,并让所有各种XML扩展都针对它进行编译。但是,错误仍然存​​在。

所以,我做了更多的调查。我用shell启动了容器:

$ docker run --entrypoint /bin/sh -it php:7.2-cli-alpine3.8

从那里开始,我使用apk添加了一些编辑和调试工具,这样我就可以手动单步执行一些代码。这样一来,我能够发现导致问题的确切Feed项目,并且更好的是,获得它试图使用的内容。

那时我意识到问题出在内容上——内容在传递给DOMDocument::loadXML()之前通过tidy扩展进行处理。出于某种原因,生成的内容不是有效的XML!(这真的非常奇怪,因为tidy的全部意义在于生成有效的标记!)

我检查了ext-tidy的版本,以及它编译的libtidy版本,然后检查了php:7.2-cli图像以查看它有什么,并发现当Alpine使用libtidy5.6.0时,基于Debian的映像使用的是5.2.0。事实上,Ubuntu18:10仍然分发5.2.0!

因此,我继续寻找如何获得较早的libtidy版本,并针对它编译tidy扩展。这是我想出的:

# DOCKER-VERSION        1.3.2

FROM php:7.2-cli-alpine3.8

# Compile-time dependencies
RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.6/community' >> /etc/apk/repositories
RUN apk update && \
  apk add --no-cache 'tidyhtml-dev==5.2.0-r1'

# Install the extension
RUN docker-php-ext-install -j$(nproc) tidy

使用上述方法构建图像后,我尝试了我的代码,错误消失了!

这篇文章之所以存在,主要是因为我的谷歌搜索一无所获。希望遇到这个问题的其他人能得到一些有用的东西!

这篇文章之所以存在,主要是因为我的谷歌搜索一无所获。希望遇到这个问题的其他人能得到一些有用的东西!

未经允许不得转载:我爱分享网 » 为基于 Alpine 的 PHP Docker 镜像构建可用的 ext-tidy

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏