今までは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
をインストールしたりします。