我已经创建了一个 Dockerfile,并且使用wordpress:php7.4-apache
。
我尝试过分别使用 3 种不同的方法安装 timezonedb 扩展。
方法 1。
RUN docker-php-source extract \
&& pecl bundle -d /usr/src/php/ext timezonedb \
&& docker-php-ext-configure timezonedb \
&& docker-php-ext-install -j$(nproc) timezonedb \
&& docker-php-source delete
方法 2。
RUN mkdir -p /usr/local/src/pecl \
&& pecl bundle -d /usr/local/src/pecl timezonedb \
&& docker-php-ext-configure /usr/local/src/pecl/timezonedb \
&& docker-php-ext-install -j$(nproc) /usr/local/src/pecl/timezonedb \
&& rm -rf /usr/local/src/pecl
方法 3。
RUN apt-get -y install gcc make autoconf libc-dev pkg-config \
&& pecl install timezonedb \
&& bash -c "echo extension=timezonedb.so > /usr/local/etc/php/conf.d/docker-php-ext-timezonedb.ini"
3种方法均能正常工作。构建docker容器后,我通过检查PHP信息确认扩展已正确安装和加载:
timezonedb 使用最新版本,根据PECL 网站是版本2022.7
。
我已经检查过了timezonedb github 文件,应该有 597 个时区。
但是,检查 timezonedb 数组后,我发现它只包含 420 个时区。
那么,问题是,为什么会有如此大的不同?我在这里忽略了什么?
任何帮助都将非常感激。
答案1
一切正常!只需尝试使用ALL_WITH_BC
时区组。
https://www.php.net/manual/en/class.datetimezone.php
echo 'ALL : ';
echo count(timezone_identifiers_list(DateTimeZone::ALL)); // -> result : 425
echo '<br/>';
echo 'ALL_WITH_BC : ';
echo count(timezone_identifiers_list(DateTimeZone::ALL_WITH_BC)); // -> result : 593
echo '<br/>';
答案2
我认为从根本上来说,这归结为标签php7.4-apache
与当时底层操作系统映像中包含的内容的结合。(由于图像中的问题表明它使用“外部”数据库,因此我认为这是操作系统提供的数据库。)
如果你快速浏览一下wordpress
Dockerhub页面,他们没有php7.4-apache
在他们的列表中支持的标签。
搜索这个会发现这次提交在相应的存储库中,注意 php 7.4 是如何 EOL 的,因此他们删除了对它的支持。
也就是说,看起来以这种方式标记的图像中的所有内容都已过时,因为它不再维护,而不仅限于 Olsen 数据库。
我认为这种情况的安全方面可能比过时的 Olsen 数据库更令人担忧。
我认为选择一个不太具体的标签(甚至latest
、 或apache
、 或6
或6-apache
任何可能符合您要求的标签)可能是一个好主意,除非您确实有非常具体的要求。
如果您确实有要求迫使您使用一些更具体的标签,您只需记住,这种特定标签的生命周期可能比更通用的标签更短,并随时了解其状态。
答案3
如果有人遇到同样的情况,我希望这会有所帮助。
因此,开发人员最终联系了我,说他终于设法获得了正确的时区。
他说他必须使用 PHP 包装器来获取时区。
这确认timezonedb安装正确。
我想感谢@ceejayoz 和@håkan-lindqvist 的帮助,我真的很感激,我花了相当长的时间才解决这个问题。