作者:菜鸟php | 来源:互联网 | 2023-01-11 13:25
我已经阅读了许多示例,这些示例可为您的PHP特定设置(包括安装扩展)创建dockerfile。该docker-php-ext-install
命令有时-j$(nproc)
作为选项包括在内。那里到底发生了什么?我怀疑nproc
与进程数量有关吗?
这是来自https://github.com/docker-library/docs/tree/master/php#php-core-extensions的示例
FROM php:7.0-fpm
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
&& docker-php-ext-install -j$(nproc) iconv mcrypt \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
我是Docker的新手,想确切地了解每个步骤中发生的事情,而不是盲目地复制和粘贴各种示例和教程中的内容。
1> Matteo Ragni..:
它是make
脚本内包含的调用的作业数docker-php-ext-install
(第53行将选项存储在变量中,$j
而105-106调用make -j$j
)。
该命令nproc
直接向脚本提供系统可用的物理线程数。例如,在我的系统上,它将减少为:
make -j$(nproc) -> make -j8
因此,它通过8个并行配方运行。
从make
手册:
-j [jobs], --jobs[=jobs]
:
指定要同时运行的作业(命令)数。如果有多个-j
选项,则最后一个选项有效。如果-j
给出的选项不带参数,make将不会限制可以同时运行的作业数量。
在GNU make
有关并行作业的文档中有更多信息:
GNU make知道如何一次执行多个配方。通常,make一次只能执行一个配方,等待完成后再执行下一个。但是,-j
or --jobs
选项告诉make 同时执行许多配方。[...]在MS-DOS上,该-j
选项无效,因为该系统不支持多重处理。
如果该-j
选项后跟一个整数,则这是一次执行的配方数;这称为作业插槽数。如果在-j
选项后没有什么看起来像整数,则作业插槽的数量没有限制。作业插槽的默认数量是1,这意味着串行执行(一次执行一次)。
理想情况下,如果该数量等于可用的物理线程数量(大约为处理器数量,或在这种情况下为返回的数量nproc
),则应该获得最快的编译速度。但是,您必须考虑可用的内存。例如,如果您分配的8个插槽仅具有1GB的RAM,并且3个同时进行的作业的编译将填满RAM,那么当第四个作业启动时,由于内存不足,它将退出并出现错误,从而使整个编译过程停止。