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. 下準備
  2. 最新版の Composer を使う場合
  3. バージョンを指定する場合
  4. 動作確認

1. 下準備

今回サンプルで作ったファイル構成は以下の通りです。

/path/to/your-dir/
  ├ Dockerfile
  └ docker-compose.yml
/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 イメージを使っています。

Dockerfile を作った後には docker-compose up コマンドでコンテナをビルド&起動してください。

何度も試す場合など your-dir_myapp-php:latest イメージが既にある場合は削除してからビルドしてください。
(your-dir にはフォルダ名が入ります)

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

2. 最新版の Composer を使う場合

最新版の Composer を使う場合、下記のように書くことができます。

/Dockerfile
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 内で使用する変数を定義するものです。

$composer_setup_hash の値は執筆時点でのもので、今後変更になる可能性があります。

ハッシュ値は下記公式サイトの「Command-line installation」に掲載されているコマンドの該当箇所をご確認ください。

また php composer-setup.php の部分で付けている --install-dir はインストール先のフォルダ、--filename は Composer のファイル名を指定するオプションです。
サンプルでは /usr/local/bin/composer というファイルパスでインストールしています。
このオプションについても、下記公式サイトの「Installer Options」の箇所で紹介されています。

3. バージョンを指定する場合

任意のバージョンの Composer を使用する場合は下記内容で実現できます。

/Dockerfile
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 はバージョン番号のリンク先です)

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 イメージを削除してから、再度ビルドしてみてください。