blog.heartyfluid

勉強したることども

[PHP][Docker]Docker コンテナ上の Composer キャッシュを永続化する

なんでもかんでも永続化するのもよろしくない(というかコンテナらしくない)と思いつつ、必要があってやってみた内容をメモ。

1. Composer のキャッシュのありかを確認する

以下のとおり、 composer コマンドでキャッシュのパスを確認できる。

Config - Composer

$ composer config cache-dir
/root/.composer/cache

この /root/.composer/cache の内容が永続化できればよい。

2. Composer のキャッシュを永続化するよう設定する

Composer のキャッシュがホスト側に永続化されるよう、 ./docker-compose.yml に以下のように追記した。

services:
  php:
    volumes:
      - type: bind
        source: ./.composer
        target: /root/.composer

/root/.composer/cache でなく /root/.composer 全体をバインドしているのは、source にあたるディレクト./.composer を空ディレクトリとして Git リポジトリに含めておきたかったため。

ディレクト./.composer を Git リポジトリに含めるため、ファイル ./.composer/.gitignore をコミットしておきたい。ところが、 cache ディレクトリの中身はコマンド composer clear-cache を実行するなどした際にすべて消される。そのため、 cache ディレクトリを直接この方法で永続化しようとすると、キャッシュを破棄する際に ./.composer/.gitignore まで消されてしまう。

空のディレクトリを維持するための、 .gitkeep と .gitignore の使い分け - Qiita

ところで volumes の long syntax は人に勧められて今回初めて使った。

docker-compose の bind mount を1行で書くな

と、ひととおり事が済んだあとでよく考えたら、 type: bind でなく type: volume で十分だったかもしれない。こちらなら、ホスト側にディレクトリを用意する手間がない。

Compose file version 3 reference | Docker Documentation