LoginSignup
24
12

More than 3 years have passed since last update.

Laravel Sail 使って開発したかっただけなのに......

Last updated at Posted at 2021-04-12

はじめに

laravel でコンテナ開発を一瞬で始められると噂のLaravel Sail 使って意気揚々と開発始めたらハマった。。。

ちなみに下記記事参考にしました。

やりたかったこと

ただ Laravel 使ってdocker環境で開発したかっただけなのに。。。

まずは4コマンドでLaravelアプリ作成

terminal
$ curl -s https://laravel.build/larademo | bash
$ cd larademo
$ ./vendor/bin/sail up -d
$ ./vendor/bin/sail php artisan vendor:publish --tag=serverless-config

docker-compose.yml

docker-compose.yml

version: '3'
    services:
        laraveldemo:  # コンテナ名は変更した。元々はlaravel.test
            build:
                context: ./vendor/laravel/sail/runtimes/8.0
                dockerfile: Dockerfile
                args:
                    WWWGROUP: '${WWWGROUP}'
            image: sail-8.0/app
            ports:
                - '${APP_PORT:-80}:80'
            environment:
                WWWUSER: '${WWWUSER}'
                LARAVEL_SAIL: 1
            volumes:
                - '.:/var/www/html'
            networks:
                - sail
            depends_on:
                - mysql
                # - pgsql
                # - redis
                # - selenium
        # selenium:
        #     image: 'selenium/standalone-chrome'
        #     volumes:
        #         - '/dev/shm:/dev/shm'
        #     networks:
        #         - sail
        mysql:
            image: 'mysql:8.0'
            ports:
                - '${FORWARD_DB_PORT:-3306}:3306'
            environment:
                MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
                MYSQL_DATABASE: '${DB_DATABASE}'
                MYSQL_USER: '${DB_USERNAME}'
                MYSQL_PASSWORD: '${DB_PASSWORD}'
                MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
            volumes:
                - 'sailmysql:/var/lib/mysql'
            networks:
                - sail
            healthcheck:
              test: ["CMD", "mysqladmin", "ping"]
        # pgsql:
        #     image: postgres:13
        #     ports:
        #         - '${FORWARD_DB_PORT:-5432}:5432'
        #     environment:
        #         PGPASSWORD: '${DB_PASSWORD:-secret}'
        #         POSTGRES_DB: '${DB_DATABASE}'
        #         POSTGRES_USER: '${DB_USERNAME}'
        #         POSTGRES_PASSWORD: '${DB_PASSWORD:-secret}'
        #     volumes:
        #         - 'sailpostgresql:/var/lib/postgresql/data'
        #     networks:
        #         - sail
        #     healthcheck:
        #       test: ["CMD", "pg_isready", "-q", "-d", "${DB_DATABASE}", "-U", "${DB_USERNAME}"]
        # redis:
        #     image: 'redis:alpine'
        #     ports:
        #         - '${FORWARD_REDIS_PORT:-6379}:6379'
        #     volumes:
        #         - 'sailredis:/data'
        #     networks:
        #         - sail
        #     healthcheck:
        #       test: ["CMD", "redis-cli", "ping"]
        # memcached:
        #     image: 'memcached:alpine'
        #     ports:
        #         - '11211:11211'
        #     networks:
        #         - sail
        # mailhog:
        #     image: 'mailhog/mailhog:latest'
        #     ports:
        #         - '${FORWARD_MAILHOG_PORT:-1025}:1025'
        #         - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
        #     networks:
        #         - sail
    networks:
        sail:
            driver: bridge
    volumes:
        sailmysql:
            driver: local
        # sailpostgresql:
        #     driver: local
        # sailredis:
        #     driver: local

環境によってenvファイルを分ける

詳しくはこちら

デフォルトで入っている.env ファイルは使わずに、
.env.local
.env.stg
.env.prod
と環境ごとに分けた。

よし、フロントはVuetify使いたいしインストールするかぁ。。

$ ./vendor/bin/sail npm install vuetify
ERROR: No such service: laravel.test

あれ???

他のモジュールをインストールしようとしても、composer require しても同じ結果だった。

原因は./vendor/laravel/sail/bin/sail にあった。

知らんかったことその1

.env ファイルを読み込みにいく設定がデフォだった。

./vendor/laravel/sail/bin/sail
(省略)
if [ -f ./.env ]; then
   source ./.env
fi
(省略)

知らんかったことその2

環境変数APP_SERVICEを設定&&コンテナ名と同じにする必要がある

./vendor/laravel/sail/bin/sail
(省略)
# Define environment variables...
export APP_PORT=${APP_PORT:-80}
export APP_SERVICE=${APP_SERVICE:-"laravel.test"} # .envファイルにはAPP_SERVICEがデフォで定義されないので自動的にlaravel.test
export DB_PORT=${DB_PORT:-3306}
export WWWUSER=${WWWUSER:-$UID}
export WWWGROUP=${WWWGROUP:-$(id -g)}
(省略)
./vendor/laravel/sail/bin/sail
(省略)
if [ $# -gt 0 ]; then
    # Source the ".env" file so Laravel's environment variables are available...
    if [ -f ./.env ]; then
        source ./.env
    fi

    # Proxy PHP commands to the "php" binary on the application container...
    if [ "$1" == "php" ]; then
        shift 1

        if [ "$EXEC" == "yes" ]; then
            docker-compose exec \
                -u sail \
                "$APP_SERVICE" \ # ここで$APP_SERVICEが呼ばれる
                php "$@"
        else
            sail_is_not_running
        fi
(省略)

解決策

APP_SERVICEの設定

.env.local

APP_SERVICE="laraevldemo"
# ちなみに "" が必ず必要

コンテナを立ち上げる前に .env ファイルに .env.local ファイルの内容をコピーするコマンドを実行する

Makefile
up:
    touch .env
    cp .env.local .env
    .vendor/bin/sail up

おわりに

便利機能や簡単ツールはそのメリットだけ制限や柔軟性の部分で惜しい部分があるなぁと感じましたね!

参考資料

24
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
12