Laravel Sail 重建默认数据库

Ezr*_*ab_ 8 mysql laravel docker laravel-sail

根据文档:

此外,当 MySQL 容器启动时,它将确保存在名称与 DB_DATABASE 环境变量的值匹配的数据库。

我的.env文件看起来像这样。

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=
Run Code Online (Sandbox Code Playgroud)

然而,当我尝试通过 运行迁移时sail artisan migrate,我得到了这个错误: SQLSTATE[HY000] [1049] Unknown database 'test' (SQL: select * from information_schema.tables where table_schema = test and table_name = migrations and table_type = 'BASE TABLE')

我试过的:

  • 一起删除 docker 容器和图像。
  • 运行sail build --no-cache(尝试完全重建一切)
  • 运行时sail shell,我进入 MySQL 并显示所有数据库。我可以在那里看到默认的 Laravel 数据库。

你怎么告诉sail创建正确的DB_DATABASE

我的docker-compose.yml

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    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
            - redis
    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
    redis:
        image: 'redis:alpine'
        ports:
            - '${FORWARD_REDIS_PORT:-6379}:6379'
        volumes:
            - 'sailredis:/data'
        networks:
            - sail
    mailhog:
        image: 'mailhog/mailhog:latest'
        ports:
            - 1025:1025
            - 8025:8025
        networks:
            - sail
networks:
    sail:
        driver: bridge
volumes:
    sailmysql:
        driver: local
    sailredis:
        driver: local
Run Code Online (Sandbox Code Playgroud)

Bee*_*oon 17

案例 - 重用已创建的 Docker 卷

如果使用 停止 Sail sail down,数据卷将保留在 Docker 主机上而不会被删除。

当 Sail 停止时,用于sail down -v删除现有的 Docker 卷数据。

首先sail up,DB_DATABASE=forge

首次启动 Sail 时,会在 Docker 主机上创建一个卷。

grep DB_DATABASE .env
DB_DATABASE=forge

docker volume ls
DRIVER    VOLUME NAME

sail up -d
Creating network "test_sail" with driver "bridge"
Creating volume "test_sailmysql" with local driver
Creating volume "test_sailredis" with local driver
Creating test_mailhog_1 ... done
Creating test_mysql_1   ... done
Creating test_redis_1   ... done
Creating test_laravel.test_1 ... done

docker volume ls
DRIVER    VOLUME NAME
local     test_sailmysql
local     test_sailredis

sail mysql
mysql> show databases;
| forge              |
Run Code Online (Sandbox Code Playgroud)

但是,当我退出 Sail 时,Docker 容器被删除,但卷没有被删除。

sail down
Stopping test_laravel.test_1 ... done
Stopping test_mailhog_1      ... done
Stopping test_redis_1        ... done
Stopping test_mysql_1        ... done
Removing test_laravel.test_1 ... done
Removing test_mailhog_1      ... done
Removing test_redis_1        ... done
Removing test_mysql_1        ... done
Removing network test_sail

docker volume ls
DRIVER    VOLUME NAME
local     test_sailmysql
local     test_sailredis
Run Code Online (Sandbox Code Playgroud)

sail up、DB_DATABASE=test

如果您在相同的目录名称中启动第二个 Sail,则将重用已创建的 Docker 卷。

grep DB_DATABASE .env
DB_DATABASE=test

sail up -d
Creating network "test_sail" with driver "bridge"
Creating test_mysql_1   ... done
Creating test_redis_1   ... done
Creating test_mailhog_1 ... done
Creating test_laravel.test_1 ... done

docker volume ls
DRIVER    VOLUME NAME
local     test_sailmysql
local     test_sailredis
Run Code Online (Sandbox Code Playgroud)

由于数据存在于test_sailmysql第一次运行时创建的卷中,因此不会执行新的数据库创建任务。

sail mysql
  ERROR 1049 (42000): Unknown database 'test'
Run Code Online (Sandbox Code Playgroud)
sail artisan migrate
  Illuminate\Database\QueryException
  SQLSTATE[HY000] [1049] Unknown database 'test' (SQL: select * from information_schema.tables where table_schema = test and table_name = migrations and table_type = 'BASE TABLE')
Run Code Online (Sandbox Code Playgroud)

删除现有卷后启动

sail down -v
...
Removing volume test_sailmysql
Removing volume test_sailredis
Run Code Online (Sandbox Code Playgroud)
sail up -d
...
Creating volume "test_sailmysql" with local driver
Creating volume "test_sailredis" with local driver
Run Code Online (Sandbox Code Playgroud)
sail mysql
mysql> show databases;
| test               |
Run Code Online (Sandbox Code Playgroud)
sail artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (214.30ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (99.56ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (151.61ms)
Run Code Online (Sandbox Code Playgroud)

sail down 选项

sail down -h

    -v, --volumes           Remove named volumes declared in the `volumes`
                            section of the Compose file and anonymous volumes
                            attached to containers.
Run Code Online (Sandbox Code Playgroud)