根本原因是环境未打通,常见于wsl+docker场景:docker desktop未切至linux容器模式、wsl版本为1而非2;需切换容器模式、启用wsl2引擎、升级wsl发行版至v2并验证docker可用性。

为什么 sail 命令找不到或报错“command not found”
根本原因通常是环境没打通,不是 Laravel 项目本身的问题。常见于 WSL + Docker 搭配场景:Docker Desktop 默认可能仍运行在 Windows 容器模式,或 WSL 版本是 1 而非 2。
检查和修复步骤如下:
- 右键 Docker Desktop 图标 → 确认显示 “Switch to Windows containers”(说明当前是 Windows 模式),应点击切换为 Linux 容器
- 在 Docker Desktop Settings → General 中勾选
Expose daemon on tcp://localhost:2375 without TLS和Use the WSL 2 based engine - 终端执行
wsl.exe -l -v,若 Ubuntu(或其他发行版)版本显示为1,需升级:wsl.exe --set-version Ubuntu-20.04 2 - 再执行
wsl.exe --set-default-version 2,重启 WSL 后运行docker ps验证是否可用
sail:install 运行后没生成 docker-compose.yml 怎么办
这个命令本质是把 Sail 的默认配置复制到项目根目录,失败往往因为权限或路径问题,而非命令本身异常。
实操要点:
- 确保当前目录是 Laravel 项目的根目录(含
artisan文件),否则php artisan sail:install会静默失败 - 检查
vendor/laravel/sail/stubs/docker-compose.yml是否存在 —— 若不存在,说明laravel/sail包未正确安装,重试composer require laravel/sail --dev - 如果已安装但 stub 文件缺失,可手动从 GitHub 拉取对应版本的
docker-compose.yml(如 v1.29.0),保存到项目根目录即可,sail:install不是必须步骤
用 sail up 启动后访问不了 8000 端口
典型表现是浏览器显示连接被拒绝,或 sail ps 显示 laravel.test 容器状态为 Restarting —— 大概率是 PHP 或 Nginx 配置崩了。
排查优先级:
- 先运行
sail logs nginx和sail logs laravel.test,看是否有bind: address already in use或no such file or directory类错误 - 检查本地是否已有其他服务占用了 8000(如另一个
sail实例、Valet、XAMPP),用lsof -i :8000(macOS/Linux)或netstat -ano | findstr :8000(Windows)确认 - 若用的是自定义
APP_URL=http://localhost,请确保docker-compose.yml中的extra_hosts或本地/etc/hosts有对应映射(如127.0.0.1 laravel.test)
想换 MySQL 版本或加 Redis,怎么改 docker-compose.yml
Sail 的 compose 文件是模板,直接编辑它最直接,但要注意变量引用和依赖顺序。
关键修改点:
- MySQL 版本:找到
mysqlservice 下的image:行,改成mysql:8.0或mariadb:10.11;同时核对MYSQL_VERSION环境变量是否匹配(部分 Sail 版本会读取该变量) - 加 Redis:在 services 下新增一个
redis:块,用image: redis:7-alpine,并确保 Laravel 的.env中REDIS_HOST=redis(容器名即主机名) - 改完后必须运行
sail down && sail up -d,不能只用sail restart,否则新镜像不会拉取,旧容器也不会重建
docker ps 和 docker-compose version 在当前 shell 里能正常执行。











