Docker環境でWORKDIRをLaravelプロジェクトのルートにする手順

2020/01/09

Docker 環境で Laravel プロジェクトを作成する際、 WORKDIR に指定したディレクトリをプロジェクトのルートにしたいと思うのが人情ではないでしょうか?

laravel new . でいけると思っていたらいけなかったので、やり方をメモしておきます。

環境

  • Docker 20.10.0
  • PHP 8.0.1
  • composer 2.0.8
  • Laravel 8.21.0

失敗した方法

.docker/Dockerfile に以下のような記述をしました。 composer で laravel/installer をグローバルインストールするだけです。

FROM php:8.0-fpm

WORKDIR /var/www/html

RUN apt-get update \
    && apt-get install -y libzip-dev openssh-client git \
    && docker-php-ext-install zip

# composer install
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

RUN composer global require "laravel/installer"

次に、先程の Dockerfile から image を build。

❯ docker build . -f .docker/Dockerfile -t app:latest

作成された image からコンテナを作成し、中に入ります。 volume に指定している /var/www/html は Dockerfile で WORKDIR に指定したディレクトリですね。

❯ docker run -it -v $PWD:/var/www/html app:latest bash

さて、/var/www/html でプロジェクト作成……と思ったら、エラーが出てしまいました。

root@b2ac64f0dfaa:/var/www/html# laravel new .

 _                               _
| |                             | |
| |     __ _ _ __ __ ___   _____| |
| |    / _` | '__/ _` \ \ / / _ \ |
| |___| (_| | | | (_| |\ V /  __/ |
|______\__,_|_|  \__,_| \_/ \___|_|


In NewCommand.php line 184:

  Application already exists!


new [--dev] [--jet] [--stack [STACK]] [--teams] [-f|--force] [--] [<name>]

アプリケーションが既に作成されている? そんな馬鹿な……と思いましたが、 どうやら laravel new . はカレントディレクトリを指定しているのではなく、 . というディレクトリ名を指定している扱いになっているようですね。 デフォルトで作成される . ディレクトリが存在チェックに引っかかっているようです。

root@8ee44631bd08:/var/www/html# ls -al
total 16
drwxr-xr-x 4 1000 1000 4096 Jan  9 12:42 .
drwxr-xr-x 3 root root 4096 Dec 11 07:16 ..
drwxrwxr-x 2 1000 1000 4096 Jan  9 12:32 .docker
drwxrwxr-x 5 1000 1000 4096 Jan  9 12:34 .git

公式ドキュメントの comopser 経由を試したところ、以下のエラー。

root@b2ac64f0dfaa:/var/www/html# composer create-project laravel/laravel .
Creating a "laravel/laravel" project at "./"


  [InvalidArgumentException]
  Project directory "/var/www/html/." is not empty.

このエラーが出るのは、このディレクトリに .docker.git といったディレクトリが存在しているせいです。 新規ディレクトリを作成して同じコマンドを実行したところ、意図した通り、そのディレクトリをルートとしたプロジェクトを作成してくれました。

さて、このまま別ディレクトリで作成したプロジェクトを WORKDIRmv という手もありますが、 スマートじゃないですね。敗北感すらある。ので、別の方法を取りました。

解決策

composer イメージ を使います。

docker run --rm --interactive --tty \
  -v $PWD:/app \
  composer create-project laravel/laravel .

注意点は2つ。

  1. volume に指定するディレクトリ

composer デフォルトの WORKDIR は /app です。

laravel 作成コマンドも /app で行われるので、素直に /app をマウントしましょう。 どうしてもマウント先を変えたい方は、composer コマンドの実行前にマウント先ディレクトリへの cd を追加すれば良いと思います。

  1. ディレクトリは空にする

これは言わずもがな。

プロジェクトが作成されたら、あとはここに PHP イメージ用の Dockerfile を置いたり、docker-compose.yml を書くだけです。

まとめ

最初は WORKDIR をプロジェクトのルートディレクトリにしたい一心でしたが、 composer イメージを使ったほうが早くプロジェクト作成にたどり着けることに気づけたので良かったです。

今後はこちらを使っていくと思います。


choclucy

福岡の Web エンジニア。業務では PHP (Laravel, CakePHP) を触ってます。

© choclucy 2021, Built with Gatsby