Docker部署Laravel遇'A facade root has not been set'异常求助
解决Docker搭建Laravel环境时的"A facade root has not been set"错误
问题背景
参照Maximillian的Udemy教程搭建Docker+PHP+MySQL+Nginx环境,Docker文件统一放在dockerfiles目录下。执行docker-compose up --build server php mysql启动服务后,运行docker-compose run --rm composer create-project --prefer-dist laravel/laravel .创建Laravel项目时,抛出RuntimeException: A facade root has not been set错误。
现有配置文件
php.dockerfile
FROM php:8.0-fpm-alpine WORKDIR /var/www/html COPY src . RUN docker-php-ext-install pdo pdo_mysql
nginx.dockerfile
FROM nginx:stable-alpine WORKDIR /etc/nginx/conf.d COPY nginx/nginx.conf . RUN mv nginx.conf default.conf WORKDIR /var/www/html COPY src .
composer.dockerfile
FROM composer:latest WORKDIR /var/www/html ENTRYPOINT [ "composer" ]
docker-compose.yaml
version: '2.2' services: server: build: context: . dockerfile: dockerfiles/nginx.dockerfile ports: - '8000:80' volumes: - ./src:/var/www/html - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro php: build: context: . dockerfile: dockerfiles/php.dockerfile volumes: - ./src:/var/www/html:delegated mysql: image: mysql:5.7 env_file: - ./env/mysql.env composer: build: context: ./dockerfiles dockerfile: composer.dockerfile volumes: - ./src:/var/www/html artisan: build: context: . dockerfile: dockerfiles/php.dockerfile volumes: - ./src:/var/www/html entrypoint: ['php', '/var/www/html/artisan'] npm: image: node:14 working_dir: /var/www/html entrypoint: ['npm'] volumes: - ./src:/var/www/html
nginx.conf
server { listen 80; index index.php index.html; server_name localhost; root /var/www/html/public; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }
错误原因分析
这个错误本质是Laravel初始化阶段无法正确连接数据库,导致Facade组件无法初始化。结合当前配置,核心问题有:
- Composer容器未关联MySQL服务,创建项目时无法访问数据库
- 数据库环境变量未传递给Composer和PHP容器,Laravel无法读取连接配置
- Dockerfile中冗余的
COPY src .操作,被后续卷挂载覆盖,且可能引发权限问题
修复步骤
1. 精简Dockerfile,移除冗余操作
修改php.dockerfile:
FROM php:8.0-fpm-alpine WORKDIR /var/www/html RUN docker-php-ext-install pdo pdo_mysql
(删除COPY src .,本地目录会通过卷挂载覆盖容器内目录)
修改nginx.dockerfile:
FROM nginx:stable-alpine WORKDIR /etc/nginx/conf.d COPY nginx/nginx.conf . RUN mv nginx.conf default.conf WORKDIR /var/www/html
(删除COPY src .,同样依赖卷挂载)
2. 更新docker-compose.yaml,完善服务依赖与环境变量
version: '2.2' services: server: build: context: . dockerfile: dockerfiles/nginx.dockerfile ports: - '8000:80' volumes: - ./src:/var/www/html - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro depends_on: - php - mysql php: build: context: . dockerfile: dockerfiles/php.dockerfile volumes: - ./src:/var/www/html:delegated env_file: - ./env/mysql.env depends_on: - mysql mysql: image: mysql:5.7 env_file: - ./env/mysql.env ports: - '3306:3306' volumes: - mysql-data:/var/lib/mysql composer: build: context: ./dockerfiles dockerfile: composer.dockerfile volumes: - ./src:/var/www/html env_file: - ./env/mysql.env depends_on: - mysql artisan: build: context: . dockerfile: dockerfiles/php.dockerfile volumes: - ./src:/var/www/html entrypoint: ['php', '/var/www/html/artisan'] env_file: - ./env/mysql.env depends_on: - mysql npm: image: node:14 working_dir: /var/www/html entrypoint: ['npm'] volumes: - ./src:/var/www/html volumes: mysql-data:
关键修改点:
- 给依赖MySQL的服务添加
depends_on,确保启动顺序 - 给PHP、Composer、Artisan服务加载
mysql.env环境变量 - 添加
mysql-data卷持久化数据库数据 - 可选:暴露MySQL端口,方便本地工具连接
3. 确保mysql.env配置正确
env/mysql.env文件需包含以下内容(替换为自定义密码):
MYSQL_ROOT_PASSWORD=root123 MYSQL_DATABASE=laravel MYSQL_USER=laravel_user MYSQL_PASSWORD=laravel123
4. 重新执行项目创建流程
清理现有容器与数据:
docker-compose down -v
重新构建并启动服务:
docker-compose up --build -d server php mysql
等待MySQL完全启动(约10秒),再创建Laravel项目:
docker-compose run --rm composer create-project --prefer-dist laravel/laravel .
(注意:若src目录非空,需先清空)
5. 配置Laravel环境变量
进入src目录复制并修改.env:
cp src/.env.example src/.env
修改.env中数据库配置,与mysql.env保持一致:
DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=laravel_user DB_PASSWORD=laravel123
6. 初始化Laravel项目
生成应用密钥并迁移数据库:
docker-compose run --rm artisan key:generate docker-compose run --rm artisan migrate
验证
访问http://localhost:8000,若能看到Laravel默认欢迎页面,说明环境搭建成功。
内容的提问来源于stack exchange,提问作者React Learner
相关产品推荐
相关产品推荐

