使用正式的Alpine Docker图像向php添加yaml扩展
我正在使用这个官方php Docker图像: 现在,我需要添加对yaml扩展的支持,该扩展没有与php捆绑在一起。 我看到我使用的基本图像使用phpize 我正在尝试这种方法:使用正式的Alpine Docker图像向php添加yaml扩展,php,docker,dockerfile,alpine,phpize,Php,Docker,Dockerfile,Alpine,Phpize,我正在使用这个官方php Docker图像: 现在,我需要添加对yaml扩展的支持,该扩展没有与php捆绑在一起。 我看到我使用的基本图像使用phpize 我正在尝试这种方法: FROM php:7.1.5-alpine # Install and enable yaml extension support to php RUN apk add --update yaml yaml-dev RUN pecl channel-update pecl.php.net RUN pecl inst
FROM php:7.1.5-alpine
# Install and enable yaml extension support to php
RUN apk add --update yaml yaml-dev
RUN pecl channel-update pecl.php.net
RUN pecl install yaml-2.0.0 && docker-php-ext-enable yaml
但我有这样的错误:
running: phpize
Configuring for:
PHP Api Version: 20160303
Zend Module Api No: 20160303
Zend Extension Api No: 320160303
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
ERROR: `phpize' failed
ERROR: Service 'php_env' failed to build: The command '/bin/sh -c pecl install yaml-2.0.0 && docker-php-ext-enable yaml' returned a non-zero code: 1
最惯用的docker使用该图像并添加支持的方式是什么
我应该使用它作为基础,还是可以通过某种方式添加参数来配置所需的扩展?Alpine使用apk安装软件包。编译过程正在抱怨缺少
autoconf
,这可以在Alpine的autoconf
包中找到
我建议您运行以下命令:
RUN apk add --no-cache --virtual .build-deps \
g++ make autoconf yaml-dev
RUN pecl channel-update pecl.php.net
RUN pecl install yaml-2.0.0 && docker-php-ext-enable yaml
RUN apk del --purge .build-deps
如果需要安装其他非开发库,可以在单独的apk add
命令中安装它们。该程序将:
--no cache
安装build deps意味着您正在使用更新的索引,而不是本地缓存(因此不需要--update
或将pkg保存在缓存中)--virtual
表示您正在为以后可以删除的所有包创建一个虚拟引用(因为在编译过程之后这些包是无用的)如果您仍然遇到任何缺少的依赖项,您可以将其作为参考:Alpine使用apk安装软件包。编译过程正在抱怨缺少
autoconf
,这可以在Alpine的autoconf
包中找到
我建议您运行以下命令:
RUN apk add --no-cache --virtual .build-deps \
g++ make autoconf yaml-dev
RUN pecl channel-update pecl.php.net
RUN pecl install yaml-2.0.0 && docker-php-ext-enable yaml
RUN apk del --purge .build-deps
如果需要安装其他非开发库,可以在单独的apk add
命令中安装它们。该程序将:
--no cache
安装build deps意味着您正在使用更新的索引,而不是本地缓存(因此不需要--update
或将pkg保存在缓存中)--virtual
表示您正在为以后可以删除的所有包创建一个虚拟引用(因为在编译过程之后这些包是无用的)如果仍然遇到任何缺少的依赖项,您可以将其作为参考:最新版本(至少自2.0.4以来)要求安装yaml dev才能运行。因此,将其移动到要保留在图像中的包。另外,在alpine 3.11上,结合php alpine repository,我遇到了一个问题,它希望您添加php.ini文件的位置 只需添加以下内容:运行pear config set php_ini/etc/php7/php.ini
如果需要,可以将路径更改为php.ini位置的路径。最新版本(至少自2.0.4以来)要求安装yaml dev才能运行。因此,将其移动到要保留在图像中的包。另外,在alpine 3.11上,结合php alpine repository,我遇到了一个问题,它希望您添加php.ini文件的位置 只需添加以下内容:运行pear config set php_ini/etc/php7/php.ini
如果需要,您可以将路径更改为php.ini位置的路径。要获得
pecl
,读者还需要执行apk add php7 dev
。这对我不起作用。我做了一个phpinfo(),在“Additional.ini files parsed”字段中有值“/usr/local/etc/php/conf.d/docker php ext yaml.ini”,但扩展名似乎没有启用。当我尝试php文档中的一个示例时,会收到以下错误消息:“调用未定义的函数yaml_emit()”。有什么想法吗?好吧,我觉得很愚蠢,但我真的很想和大家分享。我删除了我的图像并重新构建,现在它工作了。只是重新构建您的图像而不删除它之前可能是问题的根源。事实上,当您再次构建同一个映像时,它会使用旧的构建来创建新的映像。我是docker的新手,我没想到会这样工作,很高兴知道。因此,感谢您的解决方案,它现在工作得非常好!只是我忘了还有一件事,你应该在你的答案中加上。如果yaml.so文件不可执行,则它将不起作用。我不得不在我的run命令中添加这一行:chmod+x$(php config--extension dir)/yaml。因此我希望它会有所帮助apk del--purge.build deps
为我提供了更多信息,因为它正在删除libyaml。我添加了一个apk add--no cache yaml
来将yaml添加到虚拟包之外,以使它对我起作用。要获取pecl
,读者还需要执行apk add php7 dev
。它对我不起作用。我做了一个phpinfo(),在“Additional.ini files parsed”字段中有值“/usr/local/etc/php/conf.d/docker php ext yaml.ini”,但扩展名似乎没有启用。当我尝试php文档中的一个示例时,会收到以下错误消息:“调用未定义的函数yaml_emit()”。有什么想法吗?好吧,我觉得很愚蠢,但我真的很想和大家分享。我删除了我的图像并重新构建,现在它工作了。只是重新构建您的图像而不删除它之前可能是问题的根源。事实上,当您再次构建同一个映像时,它会使用旧的构建来创建新的映像。我是docker的新手,我没想到会这样工作,很高兴知道。因此,感谢您的解决方案,它现在工作得非常好!只是我忘了还有一件事,你应该在你的答案中加上。如果yaml.so文件不可执行,则它将不起作用。我不得不在我的run命令中添加这一行:chmod+x$(php config--extension dir)/yaml。因此我希望它会有所帮助apk del--purge.build deps
为我提供了更多信息,因为它正在删除libyaml。我添加了一个apkadd--no cache yaml
,以将yaml添加到虚拟包之外,使其适合我