Laravel Sail
简介
Laravel Sail 是一个轻量级的命令行界面,用于与 Laravel 默认的 Docker 开发环境进行交互。Sail 为使用 PHP、MySQL 和 Redis 构建 Laravel 应用程序提供了一个很好的起点,无需事先掌握 Docker 经验。
本质上,Sail 就是 compose.yaml 文件和存储在项目根目录下的 sail 脚本。sail 脚本提供了一个 CLI,其中包含与 compose.yaml 文件定义的 Docker 容器交互的便捷方法。
Laravel Sail 支持 macOS、Linux 和 Windows(通过 WSL2)。
安装与设置
Laravel Sail 会自动安装到所有新的 Laravel 应用程序中,因此你可以立即开始使用它。
将 Sail 安装到现有应用中
如果你有兴趣在现有的 Laravel 应用程序中使用 Sail,你可以简单地使用 Composer 包管理器安装 Sail。当然,这些步骤假设你现有的本地开发环境允许你安装 Composer 依赖项:
composer require laravel/sail --dev安装 Sail 后,你可以运行 sail:install Artisan 命令。此命令会将 Sail 的 compose.yaml 文件发布到你的应用程序根目录,并修改你的 .env 文件,添加连接 Docker 服务所需的环境变量:
php artisan sail:install最后,你可以启动 Sail。要继续学习如何使用 Sail,请继续阅读本文档的其余部分:
./vendor/bin/sail upWARNING
如果你使用的是 Linux 版 Docker Desktop,你应该通过执行以下命令来使用 default Docker 上下文:docker context use default。此外,如果在容器中遇到文件权限错误,你可能需要将 SUPERVISOR_PHP_USER 环境变量设置为 root。
添加额外服务
如果你想为现有的 Sail 安装添加额外的服务,可以运行 sail:add Artisan 命令:
php artisan sail:add使用 Devcontainers
如果你想在 Devcontainer 中进行开发,你可以为 sail:install 命令提供 --devcontainer 选项。--devcontainer 选项将指示 sail:install 命令将一个默认的 .devcontainer/devcontainer.json 文件发布到你的应用程序根目录:
php artisan sail:install --devcontainer重新构建 Sail 镜像
有时你可能想完全重建 Sail 镜像,以确保镜像的所有包和软件都是最新的。你可以使用 build 命令来完成此操作:
docker compose down -v
sail build --no-cache
sail up配置 Shell 别名
默认情况下,Sail 命令是通过所有新 Laravel 应用程序中包含的 vendor/bin/sail 脚本调用的:
./vendor/bin/sail up然而,与其重复输入 vendor/bin/sail 来执行 Sail 命令,你可能希望配置一个 shell 别名,以便更轻松地执行 Sail 的命令:
alias sail='sh $([ -f sail ] && echo sail || echo vendor/bin/sail)'为确保此别名始终可用,你可以将其添加到你的主目录中的 shell 配置文件中,例如 ~/.zshrc 或 ~/.bashrc,然后重新启动你的 shell。
配置好 shell 别名后,你可以简单地键入 sail 来执行 Sail 命令。本文档其余部分的示例将假设你已经配置了此别名:
sail up启动和停止 Sail
Laravel Sail 的 compose.yaml 文件定义了多种 Docker 容器,它们协同工作以帮助你构建 Laravel 应用程序。这些容器中的每一个都是你 compose.yaml 文件中 services 配置中的一个条目。laravel.test 容器是主要的应用程序容器,它将为你的应用程序提供服务。
在启动 Sail 之前,你应确保本地计算机上没有运行其他 Web 服务器或数据库。要启动应用程序的 compose.yaml 文件中定义的所有 Docker 容器,你应该执行 up 命令:
sail up要在后台启动所有 Docker 容器,你可以以“分离”模式启动 Sail:
sail up -d应用程序容器启动后,你可以通过 Web 浏览器访问该项目:http://localhost。
要停止所有容器,你可以按 Control + C 来停止容器的执行。或者,如果容器在后台运行,你可以使用 stop 命令:
sail stop执行命令
当使用 Laravel Sail 时,你的应用程序在 Docker 容器内执行,并与本地计算机隔离。但是,Sail 提供了一种方便的方法来对你的应用程序运行各种命令,例如任意 PHP 命令、Artisan 命令、Composer 命令以及 Node / NPM 命令。
在阅读 Laravel 文档时,你经常会看到对 Composer、Artisan 和 Node / NPM 命令的引用,但这些命令并未提及 Sail。 这些示例假设这些工具已安装在你的本地计算机上。如果你使用 Sail 作为本地 Laravel 开发环境,则应使用 Sail 执行这些命令:
# 在本地运行 Artisan 命令...
php artisan queue:work
# 在 Laravel Sail 中运行 Artisan 命令...
sail artisan queue:work执行 PHP 命令
可以使用 php 命令执行 PHP 命令。当然,这些命令将使用为你的应用程序配置的 PHP 版本执行。要了解有关 Laravel Sail 可用的 PHP 版本的更多信息,请查阅 PHP 版本文档:
sail php --version
sail php script.php执行 Composer 命令
可以使用 composer 命令执行 Composer 命令。Laravel Sail 的应用程序容器包含一个 Composer 安装:
sail composer require laravel/sanctum执行 Artisan 命令
可以使用 artisan 命令执行 Laravel Artisan 命令:
sail artisan queue:work执行 Node / NPM 命令
可以使用 node 命令执行 Node 命令,而 NPM 命令可以使用 npm 命令执行:
sail node --version
sail npm run dev如果你愿意,可以使用 Yarn 代替 NPM:
sail yarn与数据库交互
MySQL
你可能已经注意到,你的应用程序的 compose.yaml 文件包含一个 MySQL 容器的条目。该容器使用一个 Docker 卷,因此即使停止和重启容器,存储在数据库中的数据也会持久保存。
此外,MySQL 容器首次启动时,会为你创建两个数据库。第一个数据库使用你的 DB_DATABASE 环境变量的值命名,用于本地开发。第二个是一个专用的测试数据库,名为 testing,它将确保你的测试不会干扰你的开发数据。
启动容器后,你可以通过将应用程序 .env 文件中的 DB_HOST 环境变量设置为 mysql 来连接到应用程序内的 MySQL 实例。
要从本地机器连接到应用程序的 MySQL 数据库,你可以使用图形化的数据库管理应用程序,例如 TablePlus。默认情况下,MySQL 数据库可通过 localhost 的 3306 端口访问,访问凭证对应于你的 DB_USERNAME 和 DB_PASSWORD 环境变量的值。或者,你可以以 root 用户身份连接,该用户也使用你的 DB_PASSWORD 环境变量的值作为其密码。
MongoDB
如果你在安装 Sail 时选择安装 MongoDB 服务,你的应用程序的 compose.yaml 文件将包含一个 MongoDB Atlas Local 容器的条目,该容器提供了带有 Atlas 功能(如 Search Indexes)的 MongoDB 文档数据库。此容器使用一个 Docker 卷,因此即使停止和重启容器,存储在数据库中的数据也会持久保存。
启动容器后,你可以通过将应用程序 .env 文件中的 MONGODB_URI 环境变量设置为 mongodb://mongodb:27017 来连接到应用程序内的 MongoDB 实例。默认情况下禁用身份验证,但你可以在启动 mongodb 容器之前设置 MONGODB_USERNAME 和 MONGODB_PASSWORD 环境变量以启用身份验证。然后,将凭据添加到连接字符串中:
MONGODB_USERNAME=user
MONGODB_PASSWORD=laravel
MONGODB_URI=mongodb://${MONGODB_USERNAME}:${MONGODB_PASSWORD}@mongodb:27017为了将 MongoDB 与你的应用程序无缝集成,你可以安装 MongoDB 维护的官方包。
要从本地机器连接到应用程序的 MongoDB 数据库,你可以使用图形化界面,例如 Compass。默认情况下,MongoDB 数据库可通过 localhost 的 27017 端口访问。
Redis
你的应用程序的 compose.yaml 文件还包含一个 Redis 容器的条目。此容器使用一个 Docker 卷,因此即使停止和重启容器,存储在 Redis 实例中的数据也会持久保存。启动容器后,你可以通过将应用程序 .env 文件中的 REDIS_HOST 环境变量设置为 redis 来连接到应用程序内的 Redis 实例。
要从本地机器连接到应用程序的 Redis 数据库,你可以使用图形化的数据库管理应用程序,例如 TablePlus。默认情况下,Redis 数据库可通过 localhost 的 6379 端口访问。
Valkey
如果你在安装 Sail 时选择安装 Valkey 服务,你的应用程序的 compose.yaml 文件将包含一个 Valkey 容器的条目。此容器使用一个 Docker 卷,因此即使停止和重启容器,存储在 Valkey 实例中的数据也会持久保存。你可以通过将应用程序 .env 文件中的 REDIS_HOST 环境变量设置为 valkey 来连接到应用程序内的此容器。
要从本地机器连接到应用程序的 Valkey 数据库,你可以使用图形化的数据库管理应用程序,例如 TablePlus。默认情况下,Valkey 数据库可通过 localhost 的 6379 端口访问。
Meilisearch
如果你在安装 Sail 时选择安装 Meilisearch 服务,你的应用程序的 compose.yaml 文件将包含一个与 Laravel Scout 集成的强大搜索引擎的条目。启动容器后,你可以通过将 MEILISEARCH_HOST 环境变量设置为 http://meilisearch:7700 来连接到应用程序内的 Meilisearch 实例。
从本地机器,你可以在 Web 浏览器中导航到 http://localhost:7700 来访问 Meilisearch 的基于 Web 的管理面板。
Typesense
如果你在安装 Sail 时选择安装 Typesense 服务,你的应用程序的 compose.yaml 文件将包含一个与 Laravel Scout 原生集成的极速开源搜索引擎的条目。启动容器后,你可以通过设置以下环境变量来连接到应用程序内的 Typesense 实例:
TYPESENSE_HOST=typesense
TYPESENSE_PORT=8108
TYPESENSE_PROTOCOL=http
TYPESENSE_API_KEY=xyz从本地机器,你可以通过 http://localhost:8108 访问 Typesense 的 API。
文件存储
如果你计划在生产环境中运行应用程序时使用 Amazon S3 存储文件,你可能希望在安装 Sail 时安装 RustFS 服务。RustFS 提供了一个与 S3 兼容的 API,你可以使用 Laravel 的 s3 文件存储驱动程序在本地进行开发,而无需在生产 S3 环境中创建“测试”存储桶。如果你在安装 Sail 时选择安装 RustFS,则 RustFS 配置部分将添加到你的应用程序的 compose.yaml 文件中。
默认情况下,你的应用程序的 filesystems 配置文件已经包含了 s3 磁盘的配置。除了使用此磁盘与 Amazon S3 交互外,你还可以通过简单地修改控制其配置的相关环境变量,将其用于与任何与 S3 兼容的文件存储服务(如 RustFS)进行交互。例如,当使用 RustFS 时,你的文件系统环境变量配置应定义如下:
FILESYSTEM_DISK=s3
AWS_ACCESS_KEY_ID=sail
AWS_SECRET_ACCESS_KEY=password
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=local
AWS_ENDPOINT=http://rustfs:9000
AWS_USE_PATH_STYLE_ENDPOINT=true运行测试
Laravel 提供了开箱即用的出色测试支持,你可以使用 Sail 的 test 命令运行应用程序的 功能测试和单元测试。Pest / PHPUnit 接受的任何 CLI 选项也可以传递给 test 命令:
sail test
sail test --group ordersSail test 命令等同于运行 test Artisan 命令:
sail artisan test默认情况下,Sail 会创建一个专用的 testing 数据库,以便你的测试不会干扰数据库的当前状态。在默认的 Laravel 安装中,Sail 还会配置你的 phpunit.xml 文件,以便在执行测试时使用此数据库:
<env name="DB_DATABASE" value="testing"/>Laravel Dusk
Laravel Dusk 提供了一个富有表现力、易于使用的浏览器自动化和测试 API。得益于 Sail,你无需在本地计算机上安装 Selenium 或其他工具即可运行这些测试。首先,在你的应用程序的 compose.yaml 文件中取消注释 Selenium 服务:
selenium:
image: 'selenium/standalone-chrome'
extra_hosts:
- 'host.docker.internal:host-gateway'
volumes:
- '/dev/shm:/dev/shm'
networks:
- sail接下来,确保你的应用程序的 compose.yaml 文件中的 laravel.test 服务有一个 depends_on 条目,指向 selenium:
depends_on:
- mysql
- redis
- selenium最后,你可以通过启动 Sail 并运行 dusk 命令来运行你的 Dusk 测试套件:
sail dusk在 Apple Silicon 上运行 Selenium
如果你的本地机器包含 Apple Silicon 芯片,你的 selenium 服务必须使用 selenium/standalone-chromium 镜像:
selenium:
image: 'selenium/standalone-chromium'
extra_hosts:
- 'host.docker.internal:host-gateway'
volumes:
- '/dev/shm:/dev/shm'
networks:
- sail预览邮件
Laravel Sail 的默认 compose.yaml 文件包含一个用于 Mailpit 的服务条目。Mailpit 会拦截你的应用程序在本地开发期间发送的电子邮件,并提供一个方便的 Web 界面,以便你可以在浏览器中预览你的电子邮件消息。使用 Sail 时,Mailpit 的默认主机是 mailpit,可通过端口 1025 访问:
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_ENCRYPTION=null当 Sail 运行时,你可以访问 Mailpit Web 界面:http://localhost:8025
容器 CLI
有时你可能希望在应用程序容器中启动一个 Bash 会话。你可以使用 shell 命令连接到应用程序的容器,从而允许你检查其文件和已安装的服务,并在容器内执行任意 shell 命令:
sail shell
sail root-shell要启动一个新的 Laravel Tinker 会话,你可以执行 tinker 命令:
sail tinkerPHP 版本
Sail 目前支持通过 PHP 8.5、8.4、8.3、8.2、8.1 或 PHP 8.0 为你的应用程序提供服务。Sail 使用的默认 PHP 版本目前是 PHP 8.5。要更改用于为你的应用程序提供服务的 PHP 版本,你应该更新应用程序的 compose.yaml 文件中 laravel.test 容器的 build 定义:
# PHP 8.5
context: ./vendor/laravel/sail/runtimes/8.5
# PHP 8.4
context: ./vendor/laravel/sail/runtimes/8.4
# PHP 8.3
context: ./vendor/laravel/sail/runtimes/8.3
# PHP 8.2
context: ./vendor/laravel/sail/runtimes/8.2
# PHP 8.1
context: ./vendor/laravel/sail/runtimes/8.1
# PHP 8.0
context: ./vendor/laravel/sail/runtimes/8.0此外,你可能希望更新你的 image 名称以反映你的应用程序使用的 PHP 版本。此选项也在你的应用程序的 compose.yaml 文件中定义:
image: sail-8.2/app更新应用程序的 compose.yaml 文件后,你应该重新构建容器镜像:
sail build --no-cache
sail upNode 版本
Sail 默认安装 Node 22。要更改在构建镜像时安装的 Node 版本,你可以更新应用程序的 compose.yaml 文件中 laravel.test 服务的 build.args 定义:
build:
args:
WWWGROUP: '${WWWGROUP}'
NODE_VERSION: '18'更新应用程序的 compose.yaml 文件后,你应该重新构建容器镜像:
sail build --no-cache
sail up共享你的站点
有时你可能需要公开分享你的站点,以便向同事预览你的站点或测试与应用程序的 Webhook 集成。要分享你的站点,你可以使用 share 命令。执行此命令后,你将获得一个随机的 laravel-sail.site URL,你可以使用该 URL 访问你的应用程序:
sail share通过 share 命令分享你的站点时,你应该使用应用程序的 bootstrap/app.php 文件中的 trustProxies 中间件方法来配置应用程序的可信代理。否则,诸如 url 和 route 之类的 URL 生成辅助函数将无法确定在 URL 生成期间应使用的正确 HTTP 主机:
->withMiddleware(function (Middleware $middleware): void {
$middleware->trustProxies(at: '*');
})如果你希望为共享站点选择子域名,可以在执行 share 命令时提供 subdomain 选项:
sail share --subdomain=my-sail-siteNOTE
share 命令由 Expose 提供支持,这是一个由 BeyondCode 开发的开源隧道服务。
使用 Xdebug 调试
Laravel Sail 的 Docker 配置包含对 Xdebug 的支持,Xdebug 是一个流行且强大的 PHP 调试器。要启用 Xdebug,请确保你已 发布 Sail 配置。然后,将以下变量添加到你的应用程序的 .env 文件中以配置 Xdebug:
SAIL_XDEBUG_MODE=develop,debug,coverage接下来,确保你已发布的 php.ini 文件包含以下配置,以便在指定模式下激活 Xdebug:
[xdebug]
xdebug.mode=${XDEBUG_MODE}修改 php.ini 文件后,请记住重新构建 Docker 镜像,以便你对 php.ini 文件的更改生效:
sail build --no-cacheLinux 主机 IP 配置
在内部,XDEBUG_CONFIG 环境变量被定义为 client_host=host.docker.internal,以便 Xdebug 能够在 Mac 和 Windows (WSL2) 上正确配置。如果你的本地机器运行的是 Linux,并且你使用的是 Docker 20.10+,则 host.docker.internal 可用,无需手动配置。
对于早于 20.10 的 Docker 版本,Linux 上不支持 host.docker.internal,你将需要手动定义主机 IP。为此,通过在 compose.yaml 文件中定义一个自定义网络来为你的容器配置静态 IP:
networks:
custom_network:
ipam:
config:
- subnet: 172.20.0.0/16
services:
laravel.test:
networks:
custom_network:
ipv4_address: 172.20.0.2设置静态 IP 后,在你的应用程序的 .env 文件中定义 SAIL_XDEBUG_CONFIG 变量:
SAIL_XDEBUG_CONFIG="client_host=172.20.0.2"Xdebug CLI 用法
可以使用 sail debug 命令在运行 Artisan 命令时启动调试会话:
# 运行 Artisan 命令而不使用 Xdebug...
sail artisan migrate
# 使用 Xdebug 运行 Artisan 命令...
sail debug migrateXdebug 浏览器用法
要在通过 Web 浏览器与应用程序交互时调试应用程序,请遵循 Xdebug 提供的说明 从 Web 浏览器启动 Xdebug 会话。
如果你使用的是 PhpStorm,请查看 JetBrains 关于 零配置调试 的文档。
WARNING
Laravel Sail 依赖 artisan serve 来为你的应用程序提供服务。从 Laravel 8.53.0 开始,artisan serve 命令才接受 XDEBUG_CONFIG 和 XDEBUG_MODE 变量。较旧版本的 Laravel(8.52.0 及以下)不支持这些变量,并且不会接受调试连接。
自定义
由于 Sail 只是 Docker,你几乎可以自由地自定义其所有内容。要发布 Sail 自己的 Dockerfile,你可以执行 sail:publish 命令:
sail artisan sail:publish运行此命令后,Laravel Sail 使用的 Dockerfile 和其他配置文件将放置在应用程序根目录下的 docker 目录中。自定义 Sail 安装后,你可能希望更改应用程序的 compose.yaml 文件中应用程序容器的镜像名称。完成此操作后,使用 build 命令重新构建应用程序的容器。如果你在一台机器上使用 Sail 开发多个 Laravel 应用程序,为应用程序镜像分配一个唯一的名称尤为重要:
sail build --no-cache