8
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

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

はじめに

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

おわりに

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

参考資料

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
8
Help us understand the problem. What are the problem?