我的 php.ini 是从哪里加载到 php Docker 容器中的?
Posted
技术标签:
【中文标题】我的 php.ini 是从哪里加载到 php Docker 容器中的?【英文标题】:From where is my php.ini being loaded in php Docker container? 【发布时间】:2018-04-26 14:21:56 【问题描述】:我正在使用 php 5.6 运行这个 Docker instance of a linux debian:jessie。
这是我的 phpinfo 的一部分:
我们可以看到php.ini
应该位于
/usr/local/etc/php
这就是我在 /usr/local/etc/ 里面的东西
但是里面没有php.ini。
另一方面,我里面有 php.ini
那么,我的 php.ini 究竟是从哪里加载的?
我们甚至没有运行 php 进程,但 php 似乎没问题 - 正在屏幕上显示 phpinfo。
【问题讨论】:
你是不是被 Docker 容器搞砸了? 是的,我可以通过另一个终端访问它 这些是你在 Docker 容器中的目录吗? 是的。在我的码头集装箱内。我刚刚创建了一个索引页面来diaply phpinfo()。我正在运行一个 apache 服务器 【参考方案1】:如果您使用类似 wodby(docker4php
或 docker4drupal
)或 lando 或试图找到“为什么 php.ini 不起作用”的答案"(和我一样),这些工具都在使用自己的方式将配置传递给 php
https://github.com/wodby/php#php-and-php-fpm-configuration
【讨论】:
【参考方案2】:让我们试一试:
它根本不存在,这意味着php将运行默认选项。
查看您的 docker 文件,它从“干净”的操作系统开始,在其中安装 Apache 和 PHP。但它永远不会将 PHP 安装中的 php.ini 文件复制到 /usr/local/etc/php
。实际上在第 31 行和第 32 行中,它创建了 conf.d 目录,仅此而已。
因此,我建议在 docker 文件的末尾添加代码以将 php.ini-production
复制到 /usr/local/etc/php.ini
,并根据需要进行编辑。或者使用默认选项。
【讨论】:
先手动试试。手动启动 docker,通过 bash 访问。然后将文件从找到它的位置复制到 /usr/local/php。编辑文件,更改一些设置并通过 phpinfo 确认它已更改。然后编辑 docker 文件以执行相同的操作。你知道如何进行 docker 修改 + 重建 + 部署吗? (提示,COPY 命令!) 我不知道,但我会找到的。我只是在用 docker 说明。 毕竟,我不需要php.ini实例与生产相同,但我仍然只需要更改1个参数。我重建了图像并没有安装 php-fpm。现在我只有 1 个地方有 php.ini。它在/etc/php5/cli/php.ini
里面。那是我们唯一拥有 php.ini 的地方。我刚刚将 max_execution_time 从 30 更改为 300。但我无法看到更改为 phpinfo 的 Web 显示。你知道如何重新初始化它吗?我在服务列表中看不到 php - service --status-all
phpinfo 显示它希望 ini 文件位于 /usr/local/etc/php 中。如果你把它放在别的地方,php 将不知道它。移到那个目录下就好了。
嗨,尼克不是我。安装后在/etc/php5/cli/php.ini
里面找到了php.ini。似乎 php:5 Dockerfile 安装了 php 5,将 php.ini 放入 /etc/php5/cli/php.ini
中,并且正如您所说,希望在 /usr/local/etc/php
中找到一些东西。因此,如果是这种情况,可能的解决方案应该是:在该路径中放置一个 php.ini(然后我可以使用我的生产 php.ini 或任何其他)或者我认为我可以将该路径更改为指向 /etc/php5/cli/php.ini
.我会尝试最后一种方法。【参考方案3】:
聚会有点晚了,但由于今天的问题仍然相关,让我补充一个简短的答案:
官方 php:7 图像从/usr/local/etc/php
文件夹中获取它们的设置。
# First log into the running container
$ docker exec -it «container_name» /bin/bash
# List folder content
$ ls /usr/local/etc/php
# Which outputs following line
conf.d php.ini-development php.ini-production
如果需要,通过 conf.d 文件夹修改设置似乎是更好的选择,因为 xdebug 使用它。例如,您可以通过将uploads.ini
添加到具有以下内容的conf.d
文件夹来更改上传大小:
file_uploads = On
memory_limit = 64M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600
ini 指令的完整列表可以在https://www.php.net/manual/en/ini.core.php找到
【讨论】:
完美响应!加油! 要快速创建自定义 ini 文件,只需在命令行中输入printf 'memory_limit = 256M\n' >> /usr/local/etc/php/conf.d/uploads.ini \
并重新加载容器。它将创建带有 memory_limit = 256M 值的 uploads.ini【参考方案4】:
docker php 镜像查找的默认 php.ini 文件是:
/usr/local/etc/php/php.ini
您可以在 phpinfo 函数的输出中看到这一点(只需在容器中运行“php -a”,然后在提示符处运行“phpinfo();”):
Configuration File (php.ini) Path => /usr/local/etc/php
Loaded Configuration File => /usr/local/etc/php/php.ini
在使用 -v 选项运行容器时,您始终可以将此文件作为卷链接以获取自定义文件,例如:
docker run -v /local/path/to/php.ini:/usr/local/etc/php/php.ini [OPTIONS] IMAGE [COMMAND] [ARG...]
我通常更喜欢使用它附带的默认 ini 文件,只需根据需要修改一些选项。如果您希望容器在构建期间执行此操作,您可以在 Dockerfile 中执行以下操作:
RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini && \
sed -i -e "s/^ *memory_limit.*/memory_limit = 4G/g" /usr/local/etc/php/php.ini
上面的RUN命令会复制默认的生产ini文件,然后会修改ini文件中的memory_limit设置为4G。
我更喜欢这种方法,因为它允许使用自定义配置,因此容器在拉取时始终使用默认值,但您仍然可以选择通过传入卷来覆盖容器中的 ini 文件。
【讨论】:
【参考方案5】:简短的回答是您不需要。如果您缺少或想要添加扩展,您可以在 Dockerfile 中通过 docker-php-ext-install
或 docker-php-ext-enable
来完成。
大多数常见的,您可以简单地启用,例如 mbstring,但对于一些不太常见的,您可能必须先运行 pecl
或其他东西来获取包。看看this Docker documentation page for more information on php extensions
【讨论】:
所以当我们看到'你应该添加 "extension=imagick.so" 到 php.ini' -- 如果我们已经运行了docker-php-ext-enable imagick
,这可以忽略吗?它应该与它一起工作吗?以上是关于我的 php.ini 是从哪里加载到 php Docker 容器中的?的主要内容,如果未能解决你的问题,请参考以下文章