【Docker】【Laravel】docker-compose 立ち上げ時にLaravelの初期構築コマンドを実行する

久しぶりに新しく一から作るWebアプリケーションを作る事になり、数年ぶりに色々情報をアップデートしました。

さて、
アプリケーションの開発環境を作る場合、なるべく初期構築手順を簡略化したいものです。 今回はDocker で環境を立ち上げた際に、Laravelの初期構築を行うコマンドも実行してしまう方法について触れます。

Docker イメージについて

一般的なWebアプリケーションで、簡単に作れる構成にしました。

コンテナ バージョン 役割
php 8.0-apache webサーバー、兼、アプリケーションサーバー
mysql 8.0 データベースサーバー

初期構築するコマンド

初期構築のコマンドは色々ありますが、今回は次のコマンドを構築時に実行したいと思います。

# 必要な php ライブラリをインストール 
$ composer install    

# パーミッション設定(開発環境なので簡単な設定です)
$ chmod -R 777 /var/www/<Laravel のプロジェクトディレクトリ>

# Laravelのマイグレーション
$ php artisan migrate --seed

# storage/public ディレクトリにシンボリックリンクを貼る
$ php artisan storage:link

コンテナ立ち上げ時に、コマンドを実行するための方法

コンテナを実行する際に、先述したコマンドを実行する場合は CMD を使用します。
  docs.docker.jp

設定しておくと、docker-compose up で立ち上がる度に実行されます。
上記コマンドを纏めて次のような指定をします。

// dockerfile
CMD bash -c "composer install && chmod -R 777 /var/www/<Laravelのプロジェクトディレクトリ> && php artisan migrate --seed && php artisan storage:link"

この状態でコンテナを立ち上げると、コマンドを上(左)から順に実行していきますので一括で環境を作る事ができます。

php-apache 系のイメージを使う場合

※若干、不完全燃焼感がある内容ですのでご了承ください。

php のDockerコンテナは用途に合わせて色々扱っています。

hub.docker.com

php-apache 系のイメージはwebサーバーの役割も担っていますので、コンテナを立ち上げるとapacheをフォアグラウンドで実行します。

$ docker-compose up 
...
php-apache_1  | [Sat Jul 02 06:50:13.325205 2022] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.53 (Debian) PHP/8.0.20 configured -- resuming normal operations
php-apache_1  | [Sat Jul 02 06:50:13.325253 2022] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'

 
しかし、
今回のようにCMD を使用してしまうと、初期実行するコマンドを上書きしてしまういます。
そのため、追加した CMD のスクリプトを実行した後にコンテナが止まってしまいます。
コンテナが止まると、webサーバーも止まりますのでブラウザで表示できなくなります。

コンテナを止めないためには、CMD のスクリプトの最後に終了命令が入力されるまで実行し続けるコマンドを実行します
よく用いられる方法として、 \bin\bash を用いて対話状態にする方法です。

今回はwebサーバーを兼任していますので、apache をフォアグラウンドで起動させる事でコンテナを動かし続けます。

// dockerfile
CMD bash -c "composer install && chmod -R 777 /var/www/<Laravel のプロジェクトディレクトリ> && php artisan migrate --seed && php artisan storage:link && apachectl -D FOREGROUND"

懸念点

上記の方法で立ち上げた後、「ERROR: 2」と言うメッセージが表示されます。

$ docker-compose up
Killing php-apache    ... done
Killing mysql           ... done
ERROR: 2

実行結果を見るとコンテナを閉じれていますので、差し当たる問題はなさそうです。
とはいえ、若干気持ち悪いですね…

©︎2017-2018 WebSandBag