Docker 公式 PHP 7.4 イメージで GD ライブラリをインストールする方法

はじめに

これまでに Docker 公式イメージを使った PHP 動作環境の構築方法をいくつかご紹介してきました。

PHP の公式イメージにはデフォルトでいくつかの 拡張モジュールが含まれていますが、GD はインストールされていません。

そこで今日は、PHP 7.4 の Docker 公式イメージに GD ライブラリをインストールする方法 をご紹介します。

今回は GD インストールのコマンドを Dockerfile に記述する形にしています。
記事内で Dockerfile コードの下部にある表は gd_info() の結果をまとめたものです。

またコマンドを Dockerfile に書かずに、コンテナ内で直接入力することも可能です。詳しくは「9. コマンドでインストール」をご参照ください。

Docker
19.03.1
Docker Compose
1.24.1
PHP
7.4.9
目次
  1. 下準備
  2. -j$(nproc) について
  3. 最小構成(PNG 使用可能)
  4. FreeType 2
  5. JPEG
  6. WebP
  7. XPM
  8. 複数組み合わせ
  9. コマンドでインストール
  10. おわりに

1. 下準備

今回作ったファイルの構成と内容は以下の通りです。
Dockerfile は後ほどご紹介します。

/path/to/your-dir/
    ├ docker/
    │  ├ Dockerfile
    │  └ docker-compose.yml
    │
    └ html/
        └ index.php
docker-compose.yml
version: "3"

services:
  # Web サーバ(PHP-Apache)
  myapp-web:
    container_name: myapp-web
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - "80:80"
    volumes:
      - "../html:/var/www/html"

Docker toolbox on windows の場合は volumes でマウントするために、VirtualBox の共有フォルダ設定で /path/to/your-dir/html を追加する必要があります。

設定方法は「docker toolbox windows volumes 共有」などで検索すると、みつかると思います。

/html/index.php
<pre><?php var_dump(gd_info()); ?></pre>

Dockerfile を作った後には、下記コマンドでコンテナをビルド&起動してください。

何度も試す場合など docker_myapp-php:latest イメージが既にある場合は削除してからビルドしてください。

$ cd /path/to/your-dir/docker
$ docker-compose up -d

2. -j$(nproc) について

これから紹介するコマンドの中に -j$(nproc) というオプションが出てきますが、
結論から書くと、Docker hub の PHP のページで紹介されているので付与しています。

詳細は割愛しますが、このオプションでは同時に実行できる処理数を $(nproc) 個に指定しています。
$(nproc) というのは nproc コマンドの結果で、CPU 数になります。

root@123456789abc:/var/www/html# nproc
1

いくつかのコマンドを -j$(nproc) 無しで試してみましたが、僕の環境では大きな変化は感じられませんでした。
(時間計測はしていません)

ネットで軽く調べたところ、指定した方が速かったり、指定処理数によっても違うという記事もありました。

ただ現時点ではよく分からないので、今回は上記 Docker Hub の PHP ページにあるサンプルに倣い -j$(nproc) を付けてご紹介することにした次第です。

詳しく知りたい方は「make jオプション」などで検索すると色々な記事がみつかると思います。

3. 最小構成(PNG 使用可能)

前置きが長くなりましたが、ここから本題です。

オプション無しで GD ライブラリをインストールする場合は、下記のように書けます。

/docker/Dockerfile
FROM php:7.4-apache

RUN apt-get update &&\
  # 最小構成(PNG 可)
  apt-get install -y zlib1g-dev libpng-dev &&\
  docker-php-ext-install -j$(nproc) gd
FreeType PNG WebP
GIF Read WBMP BMP
GIF Create XPM TGA Read
JPEG XBM JIS JP Font

上記 gd_info() の結果を見ても分かる通り、オプション無しでも PNG 形式に対応しています。

PHP 公式の GD インストール手順ページでも「png」の説明部分に、
PHP 7.4 から libpngzlib が必須になったと書かれていますね。

4. FreeType 2

FreeType というのはフォント描画のためのライブラリで、GD では imagettftext() などを使う場合に必要となります。

これを有効にするには apt-get で libfreetype6-dev を入れて、
configure で --with-freetype を指定します。

/docker/Dockerfile
FROM php:7.4-apache

RUN apt-get update &&\
  # FreeType 対応
  apt-get install -y libfreetype6-dev &&\
  docker-php-ext-configure gd --with-freetype &&\
  docker-php-ext-install -j$(nproc) gd
FreeType PNG WebP
GIF Read WBMP BMP
GIF Create XPM TGA Read
JPEG XBM JIS JP Font

apt-get で libfreetype6-dev を入れる場合は zlib1g-devlibpng-dev不要 です。
(自動的にインストールされるため)

動作確認には、下記 PHP 公式 imagettftext() のページにあるサンプルコードも使えます。

5. JPEG

JPEG を有効化するには apt-get で libjpeg62-turbo-dev を入れて、
configure で --with-jpeg を指定します。

/docker/Dockerfile
FROM php:7.4-apache

RUN apt-get update &&\
  # JPEG 対応
  apt-get install -y zlib1g-dev libpng-dev libjpeg62-turbo-dev &&\
  docker-php-ext-configure gd --with-jpeg &&\
  docker-php-ext-install -j$(nproc) gd
FreeType PNG WebP
GIF Read WBMP BMP
GIF Create XPM TGA Read
JPEG XBM JIS JP Font

6. WebP

GD で WebP も使えるんですね。WebP 形式は個人的にはあまり見かけないのですが、機能的に良さそうですよね。

WebP の有効化は apt-get で libwebp-dev を入れて、
configure で --with-webp を指定します。

/docker/Dockerfile
FROM php:7.4-apache

RUN apt-get update &&\
  # WebP 対応
  apt-get install -y zlib1g-dev libpng-dev libwebp-dev &&\
  docker-php-ext-configure gd --with-webp &&\
  docker-php-ext-install -j$(nproc) gd
FreeType PNG WebP
GIF Read WBMP BMP
GIF Create XPM TGA Read
JPEG XBM JIS JP Font

7. XPM

XPM 形式はなじみが無いのですが Unix 上の X Windows System で良く使われる形式みたいですね。

XPM を使うには apt-get で libxpm-dev を入れて、
configure で --with-xpm を指定します。

/docker/Dockerfile
FROM php:7.4-apache

RUN apt-get update &&\
  # XPM 対応
  apt-get install -y zlib1g-dev libpng-dev libxpm-dev &&\
  docker-php-ext-configure gd --with-xpm &&\
  docker-php-ext-install -j$(nproc) gd
FreeType PNG WebP
GIF Read WBMP BMP
GIF Create XPM TGA Read
JPEG XBM JIS JP Font

XPM については imagecreatefromxpm() はあるのですが、書き出しには対応していないようなので、imagepng() など別形式で出力する必要があります。
下記公式ドキュメントにサンプルコードがありますのでご参照ください。

8. 複数組み合わせ

これまで各ファイル形式に対応する方法をご紹介しましたが、複数の組み合わせも簡単にできます。

例えば JPEG と WebP を有効にする場合は、
apt-get で libjpeg62-turbo-devlibwebp-dev を入れて、
configure で --with-jpeg--with-webp を指定すれば OK です。

/docker/Dockerfile
FROM php:7.4-apache

RUN apt-get update &&\
  # JPEG & WebP 対応
  apt-get install -y zlib1g-dev libpng-dev libjpeg62-turbo-dev libwebp-dev &&\
  docker-php-ext-configure gd --with-jpeg --with-webp &&\
  docker-php-ext-install -j$(nproc) gd
FreeType PNG WebP
GIF Read WBMP BMP
GIF Create XPM TGA Read
JPEG XBM JIS JP Font

先にも書きましたが FreeType 2 と何かを組み合わせる場合は zlib1g-dev と libpng-dev は自動インストールされるため不要です。

/docker/Dockerfile
FROM php:7.4-apache

RUN apt-get update &&\
  # FreeType 2 & JPEG & WebP 対応
  apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libwebp-dev &&\
  docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp &&\
  docker-php-ext-install -j$(nproc) gd
FreeType PNG WebP
GIF Read WBMP BMP
GIF Create XPM TGA Read
JPEG XBM JIS JP Font

9. コマンドでインストール

Dockerfile を使わずに、直接コマンドを入力してインストールするには下記のようにします。
(下記は「5. JPEG」の例です)

$ docker exec -it myapp-web bash

root@123456789abc:/var/www/html# apt-get update
root@123456789abc:/var/www/html# apt-get install -y zlib1g-dev libpng-dev libjpeg62-turbo-dev
root@123456789abc:/var/www/html# docker-php-ext-configure gd --with-jpeg
root@123456789abc:/var/www/html# docker-php-ext-install -j$(nproc) gd

インストールが完了したらコンテナを再起動してください。

また、あとからをオプションを追加することもできます。
例えば上記 JPEG 指定で GD をインストールした後に、追加で WebP を入れる場合は下記のようにします。

root@123456789abc:/var/www/html# apt-get install -y libwebp-dev
root@123456789abc:/var/www/html# docker-php-ext-configure gd --with-jpeg --with-webp
root@123456789abc:/var/www/html# docker-php-ext-install -j$(nproc) gd

apt-get で必要なパッケージを追加して、configure しなおしてから install という流れですね。

configure では元々入ってるものも「--with-●●●」しないと使えなくなるのでご注意ください。

なお、使わなくなったオプションは下記のように削除できます。
(JPEG を外しています)

root@123456789abc:/var/www/html# docker-php-ext-configure gd --with-webp
root@123456789abc:/var/www/html# docker-php-ext-install -j$(nproc) gd
root@123456789abc:/var/www/html# apt-get remove libjpeg62-turbo-dev

10. おわりに

docker-php-ext-configure gd コマンドで指定する「--with-●●●」オプションは、PHP 公式ドキュメントの GD インストール手順のページで確認できます。

PHP 7.4 から書き方が変わっているのでご注意ください。

次に apt-get でインストールするパッケージの調べ方ですが、
例えば libwebp-dev を入れずに configure で --with-webp を行うと、下記のエラーが出ます。

root@123456789abc:/var/www/html# docker-php-ext-configure gd --with-webp
...
No package 'libwebp' found
...

次に apt-cache search を使って「libwebp」を含むパッケージを探します。

root@123456789abc:/var/www/html# apt-cache search libwebp
libwebp-dev - Lossy compression of digital photographic images.
libwebp6 - Lossy compression of digital photographic images.
libwebpdemux2 - Lossy compression of digital photographic images.
libwebpmux3 - Lossy compression of digital photographic images.

今回の場合は ●●●-dev を使うことが多かったので推測できるかもしれませんが、もし検討がつかないときには、各パッケージ名をネットで検索したり、実際にインストールして試せば答えにたどりつけると思います。

libjpeg62-turbo-dev は Docker hub の PHP ページの Description ページでサンプルとして掲載されています。

libpng-dev と zlib1g-dev については libfreetype6-dev インストール時のメッセージの中に答えがありました。

root@123456789abc:/var/www/html# apt-get install libfreetype6-dev
...
The following additional packages will be installed:
  libfreetype6 libpng-dev libpng-tools libpng16-16 zlib1g-dev
...

このように、出力されるメッセージの中にはヒントが含まれている場合が多いです。 限られた時間の中で大変だとは思うのですが、地道なメッセージ解読や調査は、理解度が深まりスキルアップにつながるのでオススメです。