実験用Laravel環境の設定メモ


今まではWindows側でcomposerを使用して構築していたものの、いろいろと問題が起きたため、dockerコンテナ内で完結するように改良したので、そのメモです。

自動インストール用スクリプトの用意

まず、composerのオフィシャルサイトに自動インストール用のシェルスクリプトがあるので、その記事を参照します。
How do I install Composer programmatically?

そして、自動インストール用のスクリプトの中身を確認していきます。

#!/bin/sh

EXPECTED_CHECKSUM="$(php -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')"
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"

if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]
then
    >&2 echo 'ERROR: Invalid installer checksum'
    rm composer-setup.php
    exit 1
fi

php composer-setup.php --quiet
RESULT=$?
rm composer-setup.php
exit $RESULT

このシェルスクリプトでは、下記の処理が行われます。

  • php -r copyによるphp内のcopyメソッドを利用したチェックサムのダウンロード
  • php -r copyによるphp内のcopyメソッドを利用したcomposer-setup.phpのダウンロード
  • ダウンロードしたインストール用スクリプトのチェックサムの計算
  • チェックサムが一致するか判定し、一致しなければexit 1で異常終了として返す
  • 一致するようであればcomposer-setup.phpのサイレント実行
  • 実行後にcomposer-setup.phpの削除
  • composer-setup.php実行後の結果を返す

これをコンテナの作成時に自動的に実行して、インストールします。

Dockerfileの設定

まず、ホスト側の docker-compose.yml が配置してあるディレクトリに、先のシェルスクリプトを composer_install.sh などとして配置します。
※Windowsの場合は文字コードがutf-8のBOM無し、改行コードがLFになるように注意します。

次に Dockerfile で、PHPのインストール処理の後に下記を追記します。
※下記では docker-compose.yml のあるディレクトリに utility ディレクトリを作成し、そこにシェルスクリプトと配置しています。

# install composer
COPY ./utility/composer_install.sh .
RUN chmod 755 composer_install.sh
RUN ./composer_install.sh
RUN mv composer.phar /usr/local/bin/composer

これは下記の処理を実行しています。

  • ホストの docoker-compose.yml のあるディレクトリから見て、./utility/composer_install.shをコンテナ側のカレントディレクトリ( 何もしていなければ root ユーザーで /root/ )にコピー
  • パーミッションを755(rwxr-xr-x)にしてシェルスクリプトとして実行可能に
  • シェルスクリプトを実行してcomposer.pharを/root/にインストール
  • パスが通るように実行ファイル用の/usr/local/bin/composerにファイル名を変更して移動

これでコンテナ内のどこでも composer コマンドが通るようになります。

プロジェクトの構築

あとは、ソースコードのディレクトリで RUN composer install を実行するように書いておけば docker compose up したときに完結するので、これでOKです。

※ もし、コンテナに入って任意のディレクトリの composerコマンドを実行して動かなかったり、build 中にエラーになる場合、修正後に docker compose build --no-cache で再構築してください。

リポジトリをゼロから作成する場合

まず、下記でコンテナに入り

docker exec -it {コンテナ名} /bin/bash

次にソースコードの同期ディレクトリで、

composer create-project laravel/laravel --prefer-dist .

して Laravel をインストールしたりします。