
atkrad/wait4x轻量级服务就绪等待工具
 docker run --rm --network my-network atkrad/wait4x:latest tcp mysql:3306
bash# 等待健康检查端点返回 200 状态码 docker run --rm atkrad/wait4x:latest http [***] --expect-status-code 200 # 等待响应体包含特定内容 docker run --rm atkrad/wait4x:latest http [***] --expect-body-regex '"status":"UP"'
yamlversion: '3.8' services: app: build: . depends_on: - db - redis command: ["dockerize", "-wait", "tcp://db:3306", "-wait", "tcp://redis:6379", "-timeout", "60s", "npm", "start"] wait4x: image: atkrad/wait4x:latest command: tcp db:3306 redis:6379 db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: appdb redis: image: redis:alpine
yamlversion: '3.8' services: api: build: ./api depends_on: db: condition: service_healthy ports: - "8080:8080" db: image: postgres:14 environment: POSTGRES_USER: user POSTGRES_PASSWORD: password POSTGRES_DB: appdb healthcheck: test: ["CMD", "docker run --rm --network=container:$$HOSTNAME atkrad/wait4x:latest postgresql 'postgres://user:password@localhost:5432/appdb?sslmode=disable'"] interval: 5s timeout: 5s retries: 5
等待端口可用:
bashdocker run --rm --network host atkrad/wait4x:latest tcp localhost:3306
等待 Web 服务器返回特定响应:
bashdocker run --rm atkrad/wait4x:latest http [***] \ --expect-status-code 200 \ --expect-body-regex '"status":"UP"'
同时等待多个服务就绪:
bashdocker run --rm --network host atkrad/wait4x:latest tcp 127.0.0.1:5432 127.0.0.1:6379 127.0.0.1:27017
等待 PostgreSQL 就绪:
bashdocker run --rm --network host atkrad/wait4x:latest postgresql \ 'postgres://user:pass@localhost:5432/mydb?sslmode=disable'
服务就绪后运行命令:
bashdocker run --rm --network host atkrad/wait4x:latest tcp localhost:8080 -- echo "服务已就绪!"
等待 HTTP 端点返回特定状态码:
bashdocker run --rm atkrad/wait4x:latest http [***] --expect-status-code 200
等待 HTTP 端点返回匹配正则表达式模式的响应:
bashdocker run --rm atkrad/wait4x:latest http [***] \ --expect-body-regex '"status":\s*"healthy"'
等待特定 JSON 字段存在或具有特定值:
bashdocker run --rm atkrad/wait4x:latest http [***] \ --expect-body-json "services.database.status"
这使用 GJSON Path 语法 进行强大的 JSON 查询。
发送带有特定头的 HTTP 请求:
bashdocker run --rm atkrad/wait4x:latest http [***] \ --request-header "Authorization: Bearer token123" \ --request-header "Content-Type: application/json"
bash# 基本存在性检查 docker run --rm atkrad/wait4x:latest dns A example.com # 带预期 IP 的检查 docker run --rm atkrad/wait4x:latest dns A example.com --expected-ip 93.184.216.34 # 使用特定名称服务器 docker run --rm atkrad/wait4x:latest dns A example.com --expected-ip 93.184.216.34 -n 8.8.8.8
bash# TCP 连接 docker run --rm --network host atkrad/wait4x:latest mysql 'user:password@tcp(localhost:3306)/mydb' # 通过 Docker 网络连接 docker run --rm --network my-network atkrad/wait4x:latest mysql 'user:password@tcp(mysql:3306)/mydb'
bashdocker run --rm --network my-network atkrad/wait4x:latest postgresql \ 'postgres://user:password@postgres:5432/mydb?sslmode=disable'
bash# 基本连接检查 docker run --rm --network my-network atkrad/wait4x:latest redis redis://redis:6379 # 带认证和数据库选择 docker run --rm --network my-network atkrad/wait4x:latest redis redis://user:password@redis:6379/0 # 检查键是否存在 docker run --rm --network my-network atkrad/wait4x:latest redis redis://redis:6379 --expect-key "session:active"
bashdocker run --rm --network my-network atkrad/wait4x:latest rabbitmq \ 'amqp://guest:guest@rabbitmq:5672/myvhost'
限制 Wait4X 的总等待时间:
bashdocker run --rm atkrad/wait4x:latest tcp localhost:8080 --timeout 30s
控制 Wait4X 重试频率:
bashdocker run --rm atkrad/wait4x:latest tcp localhost:8080 --interval 2s
使用指数退避进行更高效的重试:
bashdocker run --rm atkrad/wait4x:latest http [***] \ --backoff-policy exponential \ --backoff-exponential-coefficient 2.0 \ --backoff-exponential-max-interval 30s
等待端口变为空闲:
bashdocker run --rm atkrad/wait4x:latest tcp localhost:8080 --invert-check
等待服务停止:
bashdocker run --rm atkrad/wait4x:latest http [***] \ --expect-status-code 200 --invert-check
检查成功后执行命令:
bashdocker run --rm --network my-network --volume $(pwd):/app atkrad/wait4x:latest \ tcp db:3306 -- /app/deploy.sh
同时等待多个服务:
bashdocker run --rm --network my-network atkrad/wait4x:latest tcp db:3306 redis:6379 rabbitmq:5672
| 参数 | 描述 | 默认值 |
|---|---|---|
--timeout | 最大等待时间 (例如 30s, 5m) | 30s |
--interval | 检查间隔时间 (例如 1s, 500ms) | 1s |
--backoff-policy | 退避策略 (constant, exponential) | constant |
--backoff-exponential-coefficient | 指数退避系数 | 2.0 |
--backoff-exponential-max-interval | 指数退避最大间隔 | 30s |
--quiet | 安静模式,只输出错误信息 | false |
--verbose | 详细输出 | false |
--version | 显示版本信息 | - |
--help | 显示帮助信息 | - |
| 参数 | 描述 |
|---|---|
--expect-status-code | 期望的 HTTP 状态码 |
--expect-body-regex | 响应体应匹配的正则表达式 |
--expect-body-json | 应存在的 JSON 路径 |
--expect-body-xpath | 应匹配的 XPath 查询 |
--request-header | 发送的 HTTP 请求头 |
--expect-header | 应存在的响应头 |
--insecure | 不验证 SSL 证书 |
| 参数 | 描述 |
|---|---|
-n, --nameserver | 使用的名称服务器 |
--expected-ip | 期望的 IP 地址 |
--expected-domain | 期望的域名 |
--expected-value | 期望的记录值 |
yamlversion: '3.8' services: web: build: ./web depends_on: wait-for-dependencies: condition: service_completed_successfully command: ["npm", "start"] wait-for-dependencies: image: atkrad/wait4x:latest command: - tcp - db:3306 - redis:6379 - --timeout - 60s networks: - app-network db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: appdb networks: - app-network redis: image: redis:alpine networks: - app-network networks: app-network:
在 GitLab CI 中:
yamldeploy: stage: deploy image: docker:latest services: - docker:dind before_script: - docker pull atkrad/wait4x:latest - docker network create app-network - docker run -d --name db --network app-network -e POSTGRES_PASSWORD=pass postgres:14 - docker run --rm --network app-network atkrad/wait4x:latest postgresql 'postgres://postgres:pass@db:5432/postgres?sslmode=disable' --timeout 60s script: - docker run --name app --network app-network -d my-app-image
bash#!/bin/bash set -e # 启动数据库容器 docker run -d --name db -e POSTGRES_PASSWORD=pass postgres:14 # 等待数据库就绪 docker run --rm --network host atkrad/wait4x:latest postgresql \ 'postgres://postgres:pass@localhost:5432/postgres?sslmode=disable' \ --timeout 120s # 运行数据库迁移 docker run --rm --network host my-migration-tool migrate # 启动应用 docker run -d --name app --network host my-app
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务