Docker 公式 PHP イメージに composer を導入する Dockerfile を作る
はじめに
最近の PHP プロジェクトでは Composer が良く使われます。
CakePHP や Laravel などのフレームワークを使う場合はもちろん、ちょっとしたプログラムを作るときにも、PHP の外部ライブラリを使う際は Composer が便利ですよね。
ところで Docker 環境で Composer をインストールする手段としては、docker exec コマンドでコンテナに入り、Composer 公式サイトに掲載されているコマンドを実行する方法があります。
当ブログでも「Docker で Apache + PostgreSQL 環境を作って CakePHP 4 を動かす」などで、その方法をご紹介していますが、手動インストールが手間になることもありますよね。
そこで今日は Docker 公式の PHP イメージに Composer をインストールする Dockerfile の書き方をご紹介します。
- Docker
- 19.03.1
- Docker Compose
- 1.24.1
- PHP
- 7.4.9
1. 下準備
今回サンプルで作ったファイル構成は以下の通りです。
/path/to/your-dir/
├ Dockerfile
└ docker-compose.yml
version: "3"
services:
# PHP-Apache
myapp-web:
container_name: myapp-web
build:
context: ./
dockerfile: Dockerfile
ports:
- "80:80"
Dockerfile は後ほどご紹介しますが、今回は php:7.4-apache イメージを使っています。
- php Tags - Docker Hub
- https://hub.docker.com/_/php?tab=tags&name=7.4-apache
Dockerfile を作った後には docker-compose up コマンドでコンテナをビルド&起動してください。
何度も試す場合など your-dir_myapp-php:latest イメージが既にある場合は削除してからビルドしてください。
(your-dir にはフォルダ名が入ります)
$ cd /path/to/your-dir
$ docker-compose up -d
2. 最新版の Composer を使う場合
最新版の Composer を使う場合、下記のように書くことができます。
FROM php:7.4-apache
# composer-setup.php の ハッシュ値
# (変わっている可能性があるので、公式サイトをご確認ください)
ARG composer_setup_hash=795f976fe0ebd8b75f26a6dd68f78fd3453ce79f32ecb33e7fd087d39bfeb978342fb73ac986cd4f54edd0dc902601dc
# インストール後の Composer のフォルダ名とファイル名
ARG composer_dir=/usr/local/bin
ARG composer_filename=composer
RUN apt-get update \
# Composer インストール
&& php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php -r "if (hash_file('sha384', 'composer-setup.php') !== '$composer_setup_hash') { \
echo '!!! Failed to install Composer !!!'; \
unlink('composer-setup.php'); \
} \
echo PHP_EOL;" \
&& php composer-setup.php --install-dir=$composer_dir --filename=$composer_filename \
&& php -r "unlink('composer-setup.php');" \
# インストールした Composer のバージョン表示(確認用、省略可)
&& composer -v | grep "Composer version" \
# unzip コマンド (composer create-project で必要)
&& apt-get install -y unzip
ARG オプションは Dockerfile 内で使用する変数を定義するものです。
- args (Compose file version 3 reference | Docker Documentation)
- https://docs.docker.com/compose/compose-file/#args
$composer_setup_hash の値は執筆時点でのもので、今後変更になる可能性があります。
ハッシュ値は下記公式サイトの「Command-line installation」に掲載されているコマンドの該当箇所をご確認ください。
また php composer-setup.php の部分で付けている --install-dir はインストール先のフォルダ、--filename は Composer のファイル名を指定するオプションです。
サンプルでは /usr/local/bin/composer というファイルパスでインストールしています。
このオプションについても、下記公式サイトの「Installer Options」の箇所で紹介されています。
- Download Composer (Composer)
- https://getcomposer.org/download/
3. バージョンを指定する場合
任意のバージョンの Composer を使用する場合は下記内容で実現できます。
FROM php:7.4-apache
# インストールする Composer のバージョン と ハッシュ値
ARG composer_ver=1.10.13
ARG composer_hash=5ca7445cfd48dd27c5a84aa005a47b4d9fd91132313830609875df3a6973708f
# インストール後の Composer のファイルパス
ARG composer_path=/usr/local/bin/composer
RUN apt-get update \
# Composer インストール
&& php -r "copy('https://getcomposer.org/download/$composer_ver/composer.phar', '$composer_path');" \
&& chmod 755 $composer_path \
&& php -r "if (hash_file('sha256', '$composer_path') !== '$composer_hash') { \
echo '!!! Failed to install Composer !!!'; \
unlink('$composer_path'); \
} \
echo PHP_EOL;" \
# インストールした Composer のバージョン表示(確認用、省略可)
&& composer -v | grep "Composer version" \
# unzip コマンド (composer create-project で必要)
&& apt-get install -y unzip
処理の流れとしては、任意のバージョンの composer.phar をダウンロードして、ハッシュ値の確認をしています。
各バージョンの URL やハッシュ値は Composer の公式サイトに掲載されています。
(phar ファイルの URL はバージョン番号のリンク先です)
- Composer (composer.phar) versions history (Composer)
- https://getcomposer.org/download/#composer-history-caption
4. 動作確認
Docker コンテナ内で下記コマンドを実行して Composer のバージョンなどが表示されれば OK です。
$ docker exec -it myapp-web bash
root@123456789abc:/var/www/html# composer -v
コンテナに入れない場合は、コンテナのビルドがうまくいっていないかもしれません。
コンテナビルド時に「!!! Failed to install Composer !!!」が出ていれば、ハッシュ値が異なっていますので、公式サイトで再度ご確認ください。
コンテナに入れても composer コマンドが見つからない、バージョンが違う、というような場合は、過去に作ったイメージでコンテナをビルドしている可能性があります。Dockerfile の内容を確認の上 your-dir_myapp-php:latest イメージを削除してから、再度ビルドしてみてください。