使用bitnami/laravel镜像时出现Unknown database 'bitnami_myapp'错误求助
问题:Docker Laravel项目中POST请求/api/register时提示Unknown database 'bitnami_myapp'
我正在开发一个包含4个服务的Docker项目:Vue.js前端、bitnami/laravel最新版(作为纯API)、MySQL数据库和phpMyAdmin。通过Postman向api/register发送POST请求时,触发错误:Unknown database 'bitnami_myapp'。
相关配置文件
docker-compose.yml
version: '3.8' services: vue: image: node:latest volumes: - ./vue:/app working_dir: /app command: bash -c "npm install && npm run dev -- --host 0.0.0.0" ports: - "5173:5173" depends_on: - laravel laravel: image: bitnami/laravel:latest volumes: - ./laravel:/app ports: - "8000:8000" depends_on: - mysql environment: DB_CONNECTION: mysql DB_HOST: mysql DB_PORT: 3306 DB_USERNAME: root DB_PASSWORD: root mysql: image: mysql:latest volumes: - mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: learnAppDB ports: - "3306:3306" phpmyadmin: image: phpmyadmin/phpmyadmin:latest ports: - "8081:80" depends_on: - mysql environment: PMA_HOST: mysql volumes: mysql-data:
Laravel容器内.env
APP_NAME=Laravel APP_ENV=local APP_KEY=base64:MkDUovbXcWfO6IStDqti+OaUrP6hpBBb3uVLk+3X3Rk= APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=learnAppDB DB_USERNAME=root DB_PASSWORD=root BROADCAST_DRIVER=log CACHE_DRIVER=file FILESYSTEM_DISK=local QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 MEMCACHED_HOST=127.0.0.1 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_MAILER=smtp MAIL_HOST=mailpit MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS="hello@example.com" MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_HOST= PUSHER_PORT=443 PUSHER_SCHEME=https PUSHER_APP_CLUSTER=mt1 VITE_APP_NAME="${APP_NAME}" VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" VITE_PUSHER_HOST="${PUSHER_HOST}" VITE_PUSHER_PORT="${PUSHER_PORT}" VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
Laravel容器内config/database.php
<?php use Illuminate\Support\Str; return [ 'default' => env('DB_CONNECTION', 'mysql'), 'connections' => [ 'sqlite' => [ 'driver' => 'sqlite', 'url' => env('DATABASE_URL'), 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), ], 'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'learnAppDB'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', 'root'), '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'), ]) : [], ], 'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '5432'), 'database' => env('DB_DATABASE', 'root'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', 'root'), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'search_path' => 'public', 'sslmode' => 'prefer', ], 'sqlsrv' => [ 'driver' => 'sqlsrv', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), 'database' => env('DB_DATABASE', 'root'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', 'root'), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, ], ], 'migrations' => 'migrations', 'redis' => [ 'client' => env('REDIS_CLIENT', 'phpredis'), 'options' => [ 'cluster' => env('REDIS_CLUSTER', 'redis'), 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), ], 'default' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', '127.0.0.1'), 'username' => env('REDIS_USERNAME'), 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_DB', '0'), ], 'cache' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', '127.0.0.1'), 'username' => env('REDIS_USERNAME'), 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_CACHE_DB', '1'), ], ], ];
AuthController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; class AuthController extends Controller { public function register(Request $request) { $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:8|confirmed', ]); $user = User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => bcrypt($request->password), ]); error_log(print_r($request->all(), true)); return response()->json(['message' => 'User registered successfully'], 201); } public function login(Request $request) { $request->validate([ 'email' => 'required|string|email', 'password' => 'required|string', ]); if (!Auth::attempt($request->only('email', 'password'))) { return response()->json(['message' => 'Invalid credentials'], 401); } $user = $request->user(); $token = $user->createToken('Personal Access Token')->plainTextToken; return response()->json(['token' => $token]); } public function logout(Request $request) { $request->user()->currentAccessToken()->delete(); return response()->json(['message' => 'Logged out successfully']); } }
api.php
<?php use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; use App\Http\Controllers\AuthController; Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); }); Route::post('/register', [AuthController::class, 'register']); Route::post('/login', [AuthController::class, 'login']); Route::post('/logout', [AuthController::class, 'logout'])->middleware('auth:sanctum');
已尝试的操作
- 在Laravel容器内执行命令:
php artisan cache:clear php artisan view:clear php artisan route:clear php artisan clear-compiled php artisan config:cache - 执行
docker-compose down后删除并重新构建所有容器 - 在代码中搜索"bitnami_myapp",仅在
storage/logs/laravel.log中出现
解决方案
1. 补充Laravel服务的DB_DATABASE环境变量
Bitnami的Laravel镜像默认会设置DB_DATABASE=bitnami_myapp作为容器环境变量,优先级高于容器内的.env文件。修改docker-compose.yml中的laravel服务,添加目标数据库名:
laravel: image: bitnami/laravel:latest volumes: - ./laravel:/app ports: - "8000:8000" depends_on: - mysql environment: DB_CONNECTION: mysql DB_HOST: mysql DB_PORT: 3306 DB_USERNAME: root DB_PASSWORD: root DB_DATABASE: learnAppDB # 新增该行,指定正确的数据库名
2. 清理配置缓存并重启容器
- 停止并删除容器(如需保留MySQL数据则去掉
-v参数):docker-compose down -v - 重新启动容器:
docker-compose up -d - 进入Laravel容器,清理配置缓存(开发环境不要使用
config:cache,避免缓存旧配置):docker exec -it $(docker-compose ps -q laravel) bash php artisan cache:clear php artisan config:clear
3. 执行数据库迁移
确保数据库中已创建所需表:
docker exec -it $(docker-compose ps -q laravel) php artisan migrate
4. 验证数据库连接
进入Laravel容器,通过tinker测试连接:
docker exec -it $(docker-compose ps -q laravel) php artisan tinker DB::connection()->getPdo();
无报错则说明连接正常。
内容的提问来源于stack exchange,提问作者Brblmaur
相关产品推荐
相关产品推荐

