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. 下準備
今回作ったファイルの構成と内容は以下の通りです。
Dockerfile は後ほどご紹介します。
/path/to/your-dir/
├ docker/
│ ├ Dockerfile
│ └ docker-compose.yml
│
└ html/
└ index.php
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 共有」などで検索すると、みつかると思います。
<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 のページで紹介されているので付与しています。
- php - Docker Hub
- https://hub.docker.com/_/php
詳細は割愛しますが、このオプションでは同時に実行できる処理数を $(nproc) 個に指定しています。
$(nproc) というのは nproc コマンドの結果で、CPU 数になります。
root@123456789abc:/var/www/html# nproc
1
いくつかのコマンドを -j$(nproc) 無しで試してみましたが、僕の環境では大きな変化は感じられませんでした。
(時間計測はしていません)
ネットで軽く調べたところ、指定した方が速かったり、指定処理数によっても違うという記事もありました。
ただ現時点ではよく分からないので、今回は上記 Docker Hub の PHP ページにあるサンプルに倣い -j$(nproc) を付けてご紹介することにした次第です。
詳しく知りたい方は「make jオプション」などで検索すると色々な記事がみつかると思います。
- php/docker-php-ext-install at master · docker-library/php · GitHub
- https://github.com/docker-library/php/blob/master/7.4/buster/apache/docker-php-ext-install
- Parallel (GNU make)
- https://www.gnu.org/software/make/manual/html_node/Parallel.html
- nproc invocation (GNU Coreutils)
- https://www.gnu.org/software/coreutils/manual/html_node/nproc-invocation.html
3. 最小構成(PNG 使用可能)
前置きが長くなりましたが、ここから本題です。
オプション無しで GD ライブラリをインストールする場合は、下記のように書けます。
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 から libpng と zlib が必須になったと書かれていますね。
- PHP: インストール手順 - Manual
- https://www.php.net/manual/ja/image.installation.php
4. FreeType 2
FreeType というのはフォント描画のためのライブラリで、GD では imagettftext() などを使う場合に必要となります。
これを有効にするには apt-get で libfreetype6-dev を入れて、
configure で --with-freetype を指定します。
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-dev と libpng-dev は 不要 です。
(自動的にインストールされるため)
動作確認には、下記 PHP 公式 imagettftext() のページにあるサンプルコードも使えます。
- PHP: imagettftext - Manual
- https://www.php.net/manual/ja/function.imagettftext.php
- The FreeType Project
- https://www.freetype.org/
5. JPEG
JPEG を有効化するには apt-get で libjpeg62-turbo-dev を入れて、
configure で --with-jpeg を指定します。
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 を指定します。
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 を指定します。
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() など別形式で出力する必要があります。
下記公式ドキュメントにサンプルコードがありますのでご参照ください。
- PHP: imagecreatefromxpm - Manual
- https://www.php.net/manual/ja/function.imagecreatefromxpm.php
8. 複数組み合わせ
これまで各ファイル形式に対応する方法をご紹介しましたが、複数の組み合わせも簡単にできます。
例えば JPEG と WebP を有効にする場合は、
apt-get で libjpeg62-turbo-dev と libwebp-dev を入れて、
configure で --with-jpeg と --with-webp を指定すれば OK です。
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 は自動インストールされるため不要です。
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 から書き方が変わっているのでご注意ください。
- PHP: インストール手順 - Manual
- https://www.php.net/manual/ja/image.installation.php
次に 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
...
このように、出力されるメッセージの中にはヒントが含まれている場合が多いです。 限られた時間の中で大変だとは思うのですが、地道なメッセージ解読や調査は、理解度が深まりスキルアップにつながるのでオススメです。