我创建了一个新的 Laravel 8 项目,它附带了 Laravel Sail,一个预配置的 Docker 环境。它运行良好,直到我需要使用 PHP 扩展。
Laravel Sail 文档似乎没有提及任何有关 PHP 扩展的内容,这是一个重大问题。任何重要的 PHP 站点都必须使用多个 PHP 扩展。如果没有添加 PHP 扩展的能力,Laravel Sail(或任何其他 PHP 环境)或多或少是无用的。
中有 aDockerfile和 a 。我可以将这些文件从我自己的项目代码中复制出来或复制到我自己的项目代码中,然后破解指向这些文件的我的版本。但是,如果我这样做,我将失去 Laravel Sail 人员对这些文件所做的任何未来修复或改进。php.inivendor/laravel/sail/runtimes/8.0/vendordocker-compose.yml
我知道sail artisan sail:publish他们在 Laravel Sail 文档末尾提到的命令(https://laravel.com/docs/8.x/sail#sail-customization)。它似乎只是做了我上面提到的事情:将第三方代码复制到我的项目中,现在突然这个最终用户网站负责维护自己的 Laravel Sail 副本。
当然有一种惯用的方法可以在 Laravel Sail 中添加 PHP 扩展,而无需在我的站点代码中重新实现 Laravel Sail 的分支?
我是 Dockers / Sail 初学者,想尝试一个新的 Laravel 项目。
因此,当我执行 Laravel 全新安装并运行时,sail up我收到此错误:
no such service: laravel.test
Run Code Online (Sandbox Code Playgroud)
但是,http://localhost返回预期结果。
但http://laravel.test不返回任何东西。
刚刚更新了 PHP、Laravel 和 Docker,因此它们在最新版本上运行。
你知道我该如何解决这个问题吗?
编辑:添加了整个 docker-compose.yml 文件
version: '3'
services:
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.1
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.1/app
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
- '${APP_PORT:-80}:80'
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
mysql:
image: 'mysql/mysql-server:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_ROOT_HOST: "%" …Run Code Online (Sandbox Code Playgroud) 我尝试在 Docker 中使用 Laravel Sail 运行一个新的 Laravel 9.2 项目。(包含WSL2),索引页在2秒内加载。对于我尝试在 Docker 上运行 Sail 的现有项目,它需要大约 7 秒,而不是在 Laravel Homestead 上运行 0.3 秒。
我在这里找到了类似的帖子:但仍然不起作用。
./vendor/bin/sail up不再工作“Docker is没有运行”,从我在Laravel 页面上检查的内容来看,我需要 WSL2。docker-compose.yml(由 Laravel Sail 生成)
version: '3'
services:
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.1
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.1/app
extra_hosts:
- 'host.docker.internal:host-gateway' …Run Code Online (Sandbox Code Playgroud) 我怎样才能重新创建这个?
从Laravel 8 docs和Laravel Sail docs创建安装。
我使用该sail up命令,效果很好。该命令构建 docker 容器,连接它们,并使开发变得像我们想象的一样简单,尤其是对于 VSCode,这很好用,但在 WSL2 中开发很慢。我的意思是像“sail npm run dev”这样的命令。关于如何加快速度的任何想法?
仅供参考:在同一台机器上运行的同一个项目至少要快 10 倍。有关更多信息,我在适用于 Windows 10 的 Docker 桌面上的 i9-10900X、32 GB RAM 上进行了测试。
docker-compose.yml
# For more information: https://laravel.com/docs/sail
version: '3'
services:
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.0
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.0/app
ports:
- '${APP_PORT:-80}:80'
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
- redis
mysql:
image: 'mysql:8.0'
ports:
- '${DB_PORT}:3306'
environment: …Run Code Online (Sandbox Code Playgroud) 我开始使用 nginx 反向代理测试新的 Laravel Sail docker-compose 环境,这样我就可以在本地机器上开发时从真实的 tld 访问我的网站。
我的设置是:操作系统 - 安装了 nginx 和 docker 的 Ubuntu 桌面 20。
在主机上启用 Nginx 站点:
server {
server_name mysite.xyz;
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/ssl/certs/mysite.xyz.crt;
ssl_certificate_key /etc/ssl/private/mysite.xyz.key;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
location / {
proxy_pass http://localhost:8002;
}
}
Run Code Online (Sandbox Code Playgroud)
另外我的主机 /etc/hosts 文件中有127.0.0.1 mysite.xyz
还有我的 docker-compose:
# For more information: https://laravel.com/docs/sail
version: '3'
services:
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.0
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.0/app
ports:
- '8002:80'
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: …Run Code Online (Sandbox Code Playgroud) 我使用 Laravel Sail 作为我的开发环境。根据文档,
当 MySQL 容器启动时,它将确保存在一个名称与 DB_DATABASE 环境变量的值匹配的数据库。
这非常适合我的开发环境,但在测试方面效果不佳,因为我.env.testing定义了一个单独的数据库,并且似乎没有创建该数据库 - 当我sail mysql进入容器并运行时show databases;,它没有列出。因此,sail test与数据库相关的每个测试都无法运行。
SQLSTATE[HY000] [1045] Access denied for user ...
Run Code Online (Sandbox Code Playgroud)
我的.env文件包含以下内容:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=dev
Run Code Online (Sandbox Code Playgroud)
我的.env.testing文件包含以下内容:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test
Run Code Online (Sandbox Code Playgroud)
DB_USERNAME并且DB_PASSWORD在两个文件中是相同的。
如何创建此数据库以便在运行时可用sail test?
编辑:
当我深入研究存储库代码mysql时,我发现构建容器映像时正在创建数据库,但看起来没有创建多个数据库的选项。
MYSQL_DATABASE该变量是可选的,允许您指定要在映像启动时创建的数据库的名称。如果提供了用户/密码(见下文),则该用户将被授予对此数据库的超级用户访问权限(对应于 GRANT ALL)。
我目前正在使用 Laravel 8.48.2 和 Sail 包。我设置了 Sail,并通过 Docker Desktop 运行其映像,同时在 Windows 上将 WSL 2 与 Ubuntu 发行版结合使用。一切似乎都运转良好。
我运行后sail npm install,软件包已成功安装,但我收到以下消息:
npm notice New minor version of npm available! 7.18.1 -> 7.19.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v7.19.0
npm notice Run npm install -g npm@7.19.0 to update!
Run Code Online (Sandbox Code Playgroud)
因此,我尝试运行sail npm install -g npm@7.19.0,这给了我以下消息:
npm ERR! code EACCES
npm ERR! syscall rename
npm ERR! path /usr/lib/node_modules/npm
npm ERR! dest /usr/lib/node_modules/.npm-qUIFSsiV
npm ERR! errno -13
npm ERR! Error: EACCES: permission denied, rename …Run Code Online (Sandbox Code Playgroud) 我第一次使用 Laravel 8、 Docker 上的Tenancy For Laravel和 WSL2 开发多租户应用程序。当我尝试创建租户时出现问题。我想为每个租户创建一个新数据库,但创建数据库会出现以下错误:
SQLSTATE[42000]:
Syntax error or access violation:
1044 Access denied for user 'sail'@'%' to database 'tenant-a6d0813b-a546-428d-859a-15095724fb73'
(SQL: CREATE DATABASE `tenant-a6d0813b-a546-428d-859a-15095724fb73` CHARACTER SET `utf8mb4` COLLATE `utf8mb4_unicode_ci`)
Run Code Online (Sandbox Code Playgroud)
我什至不知道应该从哪里开始,因为我对 Docker、WLS 和 Laravel Sail 还很陌生。在将此项目移至 Docker 之前,我能够在 Xammp 上创建数据库,但现在不行了。
docker-compose.yml 文件与 Laravel 提供的一样,除了包含 phpmyadmin 的部分:
phpmyadmin:
image: phpmyadmin
restart: always
ports:
- 8080:80
environment:
- PMA_HOST=mysql
depends_on:
- mysql
networks:
- sail
Run Code Online (Sandbox Code Playgroud) Windows 11、Laravel v8.49.0、使用 Ubuntu-20.04 的带有 WSL 2 的 Docker。(已尝试使用 PHP 7.4.x、8.0.x 和 8.1.x)。
问题:
PHP Fatal error: During inheritance of ArrayAccess: Uncaught ErrorException: Return type of Illuminate\Support\Collection::offsetExists($key) should either be compatible with Ar
rayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /var/www/html/vendor/laravel/framework/src/Illuminate/C
ollections/Collection.php:1459
Run Code Online (Sandbox Code Playgroud)
设置:
bash ./vendor/bin/sail up老实说,我找不到相关问题,所以决定在这里发帖。我已添加sail到现有项目中,但无法进行全新安装,因为该项目已超出该阶段。
完整的堆栈跟踪:
laravel.test_1 | Stack trace:
laravel.test_1 | #0 /var/www/html/vendor/laravel/framework/src/Illuminate/Collections/Collection.php(13): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError()
laravel.test_1 | #1 /var/www/html/vendor/composer/ClassLoader.php(478): include('...')
laravel.test_1 …Run Code Online (Sandbox Code Playgroud) 我有一台仍在运行PHP 7.4.x 的服务器
因此,我需要使用laravel-sail安装laravel 8.x(当前版本的 laravel 是 9.x)。由于我用于开发的笔记本电脑上没有运行 PHP,因此我无法使用composer安装 laravel 。
当我运行 install 命令时curl -s "https://laravel.build/example-app?with=mysql" | bash,laravel 9.x 就会被安装。
如何让 laravel-sail 安装 laravel 8.x?
laravel-sail ×10
docker ×7
laravel ×7
php ×6
laravel-8 ×3
wsl-2 ×2
multi-tenant ×1
mysql ×1
nginx ×1
npm ×1