docker-composeでのPHP 7.4+ZipArchive環境

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点になります.

  • 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クラスを使えるようになりました