方法としてはシンプルで、まずアプリケーションとは別にcomposer.json
, composer.lock
を適当なディレクトリにコピーする。次にcomposer install
を実行して必要なライブラリ群のダウンロードを完了しておく。
1 | COPY laravel/composer.json /tmp/composer.json |
アプリケーションをコンテナにコピーした後に、先程ダウンロードしておいたvendor
ディレクトリをアプリ直下に移動する。最後にdump-autoloadコマンドでautoload.php
を生成すればOK。
1 | RUN mv -n /tmp/vendor ./ \ |
ポイント
普通にアプリケーションのコンテナを作る場合は、アプリケーションのディレクトリ全体をcopyした上でcomposer install
を実行する。この場合、composer.json
に変更が無くても他に変更があればcacheが利用出来なくなってしまうので、殆どの場合はdocker build
する度にcomposer install
が実行されてしまう。
アプリケーションよりも先にcomposer install
の実行を単独でcacheさせてしまえば、composer.json
が更新されない限りはcacheが利用されるのでdocker build
で毎回composer
が実行されてしまうことを防げる。
手順内でcomposer
のオプションとして--no-scritps --no-autoloader
をつけている理由は、アプリケーションによってはpre-install-cmd
, post-install-cmd
や名前空間の設定処理でコケてしまうためです。アプリケーションのコピー後に、vendor
を移動した上でcomposer dump-autoload
を実行するのがコツです。
Node.js界隈で、この知恵が使われていたので真似してみました。
参考
https://github.com/hanhan1978/docker-laravel54-skelton/blob/master/Dockerfile