wait-for-it.sh 是纯 bash 脚本,非 php 库,不可通过 composer 安装;须通过 dockerfile 的 copy 或 curl 下载并 chmod +x 后放入镜像 path,再在 command 中调用以等待服务就绪后启动 php 应用。

php-wait-for-it 不是 Composer 可安装的 PHP 库,它根本不存在于 Packagist 或任何主流 PHP 包仓库中。
你真正需要的是 Bash 脚本 wait-for-it.sh —— 它不是 PHP 代码,不依赖 Composer,也不该用 composer require 安装。
wait-for-it.sh 怎么进 Docker 容器?
它必须作为可执行脚本文件被复制进镜像,而不是通过 Composer 加载。
常见错误现象:
-
composer require vishnubob/wait-for-it报错 “Package not found” - 在
docker build中执行composer install后发现wait-for-it.sh还是没出现在容器里 - 容器启动时报错
/bin/sh: 1: ./wait-for-it.sh: not found(权限或路径问题)
正确做法(Dockerfile 片段):
# 下载脚本(推荐直接用 curl + chmod) RUN curl -sS https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh -o /usr/local/bin/wait-for-it.sh \ && chmod +x /usr/local/bin/wait-for-it.sh <h1>或者 COPY 已下载好的本地副本(适合离线/CI 环境)</h1><h1>COPY wait-for-it.sh /usr/local/bin/wait-for-it.sh</h1><h1>RUN chmod +x /usr/local/bin/wait-for-it.sh</h1>
注意:/usr/local/bin/ 在绝大多数 PHP 基础镜像(如 php:8.2-apache)中已位于 $PATH,所以之后可直接写 wait-for-it.sh db:5432 -- php app.php。
为什么不能用 Composer 安装它?
-
wait-for-it.sh是纯 Bash,没有composer.json,不发布到 Packagist - Composer 只管理 PHP 依赖,对 shell 脚本无感知、无安装机制
- 即使你把它放进
vendor/目录,也得手动chmod +x+PATH配置,反而更绕
如果你在项目中同时用 Composer 管理 PHP 依赖,那 wait-for-it.sh 就该和 Dockerfile 放一起,走镜像构建流程,而不是混进 composer.lock。
wait-for-it.sh 和 PHP 应用怎么协作?
它不侵入 PHP 代码,只负责“守门”:端口通了,才让 PHP 进程启动。
典型 command 写法(docker-compose.yml):
command: ["wait-for-it.sh", "db:5432", "--timeout=60", "--strict", "--", "php", "artisan", "serve"]
关键点:
-
--timeout=60:避免卡死,60 秒后失败退出(容器会 crash,Docker 会按 restart_policy 处理) -
--strict:端口不通时,wait-for-it.sh返回非零状态码,整个容器启动失败,不会静默跳过 -
--后面才是真正的 PHP 启动命令,别漏掉这个分隔符
最常被忽略的地方:wait-for-it.sh 只验证 TCP 握手成功,不验证数据库是否能执行 SQL。如果 PostgreSQL 已监听 5432,但 pg_isready 仍返回失败(比如用户权限未生效),它也会误判为“就绪”。这种场景下,你需要在 PHP 启动前加一层更细粒度的检查(比如封装一个 wait-for-db.sh 调用 pg_isready),而不是指望 wait-for-it.sh 替你做协议层判断。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











