在 PHP 的官方 docker image 中安裝 gd 與 pcntl
PHP 有提供官方 docker image 在 docker hub 上供大眾使用。但裡面只包含最精簡的 extension。
$ docker run -it --rm php:8.1-fpm-alpine /bin/sh
/var/www/html # php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib
[Zend Modules]
/var/www/html #
GD 是做圖片處理的 extension,要動態產生圖表或 og image 的時候會用到。
PCNTL 用來管理 process(例如 fork),網頁不會用到但寫 CLI 工具時很好用,很小規模時也可以拿來執行 offline job(但規模放大時務必改用專門的 job queue 機制,例如 Laravel Queue、gearman、RabbitMQ...等等,各自適用狀況不同這裡不詳加介紹)。
要用到的話可以透過 docker-php-ext-*
工具 script 在 docker file 裡面安裝,詳細說明可參照官方文件中「How to install more PHP extensions」章節的說明。
注意安裝 gd
的參數跟過去不同,部分文件提到的 --with-freetype-dir
跟 --with-jpeg-dir
後來被 --with-freetype
跟 --with-jpeg
取代。這部分的官方文件並不詳細,容易踩到地雷。
FROM php:8.1-fpm-alpine
RUN apk add --no-cache libpng-dev freetype-dev libjpeg-turbo-dev \
&& docker-php-ext-configure pcntl --enable-pcntl \
&& docker-php-ext-configure gd \
--with-freetype=/usr/include/ \
--with-jpeg=/usr/include/ \
&& NPROC=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || echo 1) \
&& docker-php-ext-install -j${NPROC} gd pcntl