Laravel Sail重建默认数据库



根据文档:

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

我的.env文件如下所示。

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=

然而,当我尝试通过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

案例-重用已创建的Docker卷

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

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

第一个sail up,DB_DATABASE=锻造

当您第一次启动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              |

然而,当我退出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

第二个sail up,DB_DATABASE=测试

如果在相同的目录名中启动第二个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

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

sail mysql
ERROR 1049 (42000): Unknown database 'test'
sail artisan migrate
IlluminateDatabaseQueryException
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')

删除现有卷后启动

sail down -v
...
Removing volume test_sailmysql
Removing volume test_sailredis
sail up -d
...
Creating volume "test_sailmysql" with local driver
Creating volume "test_sailredis" with local driver
sail mysql
mysql> show databases;
| test               |
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)

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.

您的问题是在.env文件中未设置DB_PASSWORD的情况下创建了数据库,并试图以root用户身份启动它。

如果您在没有密码或DB_USERNAME设置为root的情况下启动容器,则在运行sail up时会分别出现以下错误:

// Set DB_USERNAME to root will not create the database but you can still query mysql
bracing-mysql-1         | 2022-02-14 04:28:35+00:00 [ERROR] [Entrypoint]: MYSQL_USER="root", MYSQL_USER and MYSQL_PASSWORD are for configuring a regular user and cannot be used for the root user
bracing-mysql-1         |     Remove MYSQL_USER="root" and use one of the following to control the root user password:
bracing-mysql-1         |     - MYSQL_ROOT_PASSWORD
bracing-mysql-1         |     - MYSQL_ALLOW_EMPTY_PASSWORD
bracing-mysql-1         |     - MYSQL_RANDOM_ROOT_PASSWORD
// Did not set DB_PASSWORD results in the user not being created
bracing-mysql-1         | 2022-02-14 04:30:13+00:00 [Warn] [Entrypoint]: MYSQL_USER specified, but missing MYSQL_PASSWORD; MYSQL_USER will not be created

密码错误可能会产生误导,因为即使您在docker-compose.yml中设置了MYSQL_ALLOW_EMPTY_PASSWORD: 1,您仍然需要输入密码,否则不会创建用户。

最新更新