2 releases
| 0.1.1 | Sep 20, 2025 |
|---|---|
| 0.1.0 | Sep 20, 2025 |
#2203 in Command line utilities
25KB
246 lines
wait-for
A simple CLI to wait for a service to be available before executing a command.
wait-for is a Rust rewrite of the popular eficode/wait-for shell script. It provides a reliable way to wait for network services to become available, which is especially useful in Docker Compose setups and CI/CD pipelines.
Features
- Self-contained: No external dependencies like
netcatorwgetrequired - Cross-platform: Single binary for Linux, macOS, and Windows
- Fast: Written in Rust for optimal performance
- Docker-friendly: Perfect for container orchestration scenarios
- CI/CD ready: Seamlessly integrates with any build pipeline
Installation
Using Cargo
cargo install wait-for-rs
Download Binary
Download pre-compiled binaries from the GitHub Releases page.
Docker Usage
# Copy the binary into your Docker image
COPY wait-for /usr/local/bin/wait-for
RUN chmod +x /usr/local/bin/wait-for
# Use it in your entrypoint
ENTRYPOINT ["wait-for", "db:5432", "--", "./start-app.sh"]
Usage
Basic Examples
Wait for a TCP service:
wait-for db:5432
Wait for an HTTP service:
wait-for https://api.example.com/health
Execute a command after service is ready:
wait-for redis:6379 -- ./run-tests.sh
With custom timeout:
wait-for -t 30 postgres:5432 -- python manage.py migrate
Silent mode:
wait-for -q api:8080 -- curl http://api:8080/status
Docker Compose Example
version: "3.8"
services:
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: password
web:
image: myapp:latest
depends_on:
- db
command: ["wait-for", "db:5432", "--", "python", "manage.py", "runserver"]
CI/CD Pipeline Examples
GitHub Actions
- name: Wait for test database
run: wait-for localhost:5432 -- npm run test
GitLab CI
test:
script:
- wait-for redis:6379 -- pytest tests/
Command Line Reference
A simple CLI to wait for a service to be available before executing a command
Usage: wait-for [OPTIONS] <TARGET> [COMMAND]...
Arguments:
<TARGET> Service to wait for (host:port or URL)
[COMMAND]... Command to execute after successful wait
Options:
-t, --timeout <TIMEOUT> Timeout in seconds (0 for no timeout) [default: 15]
-q, --quiet Quiet mode - suppress output
-h, --help Print help
-V, --version Print version
Target Formats
- TCP:
host:port(e.g.,localhost:3306,redis:6379) - HTTP/HTTPS: Full URL (e.g.,
https://api.example.com/health,http://localhost:8080/ready)
Exit Codes
0: Service is available (and command executed successfully if provided)1: Timeout reached or connection failed- Other: Exit code of the executed command (if provided)
Examples by Use Case
Database Initialization
# Wait for PostgreSQL and run migrations
wait-for postgres:5432 -- python manage.py migrate
# Wait for MySQL and seed data
wait-for mysql:3306 -- npm run db:seed
Microservices
# Wait for API service before running tests
wait-for api:8080 -- npm run integration-tests
# Chain multiple service dependencies
wait-for redis:6379 && wait-for postgres:5432 -- ./start-worker.sh
Health Checks
# Wait for HTTP health endpoint
wait-for https://api.example.com/health -- curl -f https://api.example.com/data
# Custom timeout for slow services
wait-for -t 60 elasticsearch:9200 -- python index_data.py
Building from Source
git clone https://github.com/poi2/wait-for-rs.git
cd wait-for-rs
cargo build --release
The binary will be available at target/release/wait-for.
Comparison with Original wait-for
| Feature | wait-for (shell) | wait-for (Rust) |
|---|---|---|
| Dependencies | netcat/wget required | None (self-contained) |
| Platform support | Unix-like only | Linux/macOS/Windows |
| Binary size | N/A (script) | ~2MB static binary |
| Performance | Depends on external tools | Native compiled speed |
| Error messages | Basic | Detailed with context |
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is dual-licensed under either:
- MIT License (LICENSE-MIT or http://opensource.org/licenses/MIT)
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
at your option.
Acknowledgments
- Inspired by eficode/wait-for
- Built with clap for CLI parsing
- HTTP client powered by reqwest
Dependencies
~6–21MB
~234K SLoC