如何在Docker Compose中配置生产与测试双数据库
解决方案
1. 在运行的SQL容器中直接创建测试库
不用重启容器、不用动数据卷,直接给正在运行的数据库加测试库:
- 先查SQL容器名:
docker ps,比如结果里的容器名是laravel_db_1 - 进入容器的MySQL命令行:
docker exec -it laravel_db_1 mysql -u root -p,输入你在docker-compose.yml里设置的MYSQL_ROOT_PASSWORD密码 - 创建测试库:
CREATE DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 给Laravel用的数据库用户授权(如果你的业务用户不是root,比如叫
laravel):GRANT ALL PRIVILEGES ON test.* TO 'laravel'@'%'; FLUSH PRIVILEGES;
执行完这些,测试库就建好了,生产库的数据完全没影响。
2. 配置Laravel多数据库连接
修改项目根目录的.env文件,保留原生产库配置,新增测试库的配置项:
# 原有生产库配置 DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=production DB_USERNAME=laravel DB_PASSWORD=your_db_password # 新增测试库配置 DB_TEST_CONNECTION=mysql DB_TEST_HOST=db DB_TEST_PORT=3306 DB_TEST_DATABASE=test DB_TEST_USERNAME=laravel DB_TEST_PASSWORD=your_db_password
接着修改config/database.php,在connections数组里添加测试库的连接配置:
'test' => [ 'driver' => env('DB_TEST_CONNECTION', 'mysql'), 'host' => env('DB_TEST_HOST', '127.0.0.1'), 'port' => env('DB_TEST_PORT', '3306'), 'database' => env('DB_TEST_DATABASE', 'forge'), 'username' => env('DB_TEST_USERNAME', 'forge'), 'password' => env('DB_TEST_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ],
之后你就可以在Laravel中切换使用两个库,比如给测试库跑迁移:php artisan migrate --database=test,填充测试数据:php artisan db:seed --database=test。
3. DBeaver中直接切换数据库
打开DBeaver连接你的SQL容器后,左侧导航栏会直接显示production和test两个数据库,点击对应的库就能直接切换操作,不需要修改任何连接配置。
额外提醒
- 后续如果需要重置测试库,直接在DBeaver或者MySQL命令行里删除重建即可,不会影响生产库的数据。
- 除非要彻底清空所有数据库数据,否则别再执行
docker compose down -v,避免误删生产数据。
内容的提问来源于stack exchange,提问作者meowmeow
相关产品推荐
相关产品推荐

