在 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 QueuegearmanRabbitMQ...等等,各自適用狀況不同這裡不詳加介紹)。

要用到的話可以透過 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