docker-composeで作ったPHP 7.4環境で,ZipArchiveクラス(php7.4-zip)を使えるようにした話.
ローカルのWeb開発環境(Windows10)を,XAMPPからdockerに移行することにしました.
XAMPPとは,Apache+MySQL+PHPです.
ついでに,PHPのバージョンを7.4に上げます.
...docker-composeを使って,PHP 7.4+Apache+MySQLの環境は割と簡単に作れたのですが,
起動してブラウザからPHPアプリを動かしていると,「ZipArchiveクラス」を使っている箇所でエラーが出ました.
Fatal error: Uncaught Error: Class 'ZipArchive' not found
ZipArchiveクラスが無いようです.
でまぁ,php7.4-zipというパッケージが必要だったのですが,これをdockerのphp用コンテナにインストールするのにかなりハマりましたので記録します.
キモ
キモとしては,以下の2点になります.
- php7.4-zipは,Debianの公式リポジトリには(まだ?)存在しない.→ Debianパッケージ検索結果
- dockerのphpイメージは,デフォルトでDebianパッケージのインストールをブロックするようになっている.→ php Docker Official Images の “E: Package ‘php-XXX’ has no installation candidate”
前者については,
How can I install ziparchive on php 7.4?
を参考に,Suryというリポジトリを追加してそこからインストールするようにしました.
後者については,そのリンク先のドキュメントに書かれているように,
/etc/apt/preferences.d/no-debian-php
を削除(テキストファイルです)して,ブロックを解除しました.
作ったdockerfile
FROM php:7.4-apache
RUN apt install -y libzip-dev && \
docker-php-ext-install zip
RUN echo "deb https://packages.sury.org/php/ buster main" > /etc/apt/sources.list.d/php.list
RUN apt install -y ca-certificates apt-transport-https gnupg wget && \
wget -q https://packages.sury.org/php/apt.gpg -O- | apt-key add - && \
apt update
RUN rm /etc/apt/preferences.d/no-debian-php
RUN apt install -y php7.4-zip
もう少しスマートに行かないものかな~とも思いますが,
まぁこれで,PHPアプリからZipArchiveクラスを使えるようになりました