Skip to main content

A tool to wait for services and execute command. Useful for Docker containers that depend on slow to start services (like almost everything).

Project description

A tool to wait for services and execute command. Useful for Docker containers that depend on slow to start services (like almost everything).

  • Free software: BSD 2-Clause License

Installation

Currently holdup is only published to PyPI and hub.docker.com.

To install from PyPI:

pip install holdup

It has no dependencies except the optional PostgreSQL check support, which you’d install with:

pip install 'holdup[pg]'

You can also install the in-development version with:

pip install https://github.com/ionelmc/python-holdup/archive/master.zip

Alternate installation (Docker image)

Example:

docker run --rm ionelmc/holdup tcp://foobar:1234

Note that this will have some limitations:

  • executing the command is pretty pointless because holdup will run in its own container

  • you’ll probably need extra network configuration to be able to access services

  • you won’t be able to use docker run inside a container without exposing a docker daemon in said container

Usage

usage: holdup [-h] [-t SECONDS] [-T SECONDS] [-i SECONDS] [-n] service [service …] [– command [arg [arg …]]]

Wait for services to be ready and optionally exec command.

positional arguments:
service

A service to wait for. Supported protocols: “tcp://host:port/”, “path:///path/to/something”, “unix:///path/to/domain.sock”, “eval://expr”, “pg://user:password@host:port/dbname” (“postgres” and “postgresql” also allowed), “http://urn”, “https://urn”, “https+insecure://urn” (status 200 expected for http*). Join protocols with a comma to make holdup exit at the first passing one, eg: “tcp://host:1,host:2” or “tcp://host:1,tcp://host:2” are equivalent and mean any that pass.

command

An optional command to exec.

optional arguments:
-h, --help

show this help message and exit

-t SECONDS, --timeout SECONDS

Time to wait for services to be ready. Default: 60.0

-T SECONDS, --check-timeout SECONDS

Time to wait for a single check. Default: 1.0

-i SECONDS, --interval SECONDS

How often to check. Default: 0.2

-v, --verbose

Verbose mode.

--verbose-passwords

Disable PostgreSQL/HTTP password masking.

-n, --no-abort

Ignore failed services. This makes holdup return 0 exit code regardless of services actually responding.

--insecure

Disable SSL Certificate verification for HTTPS services.

--version

display the version of the holdup package and its location, then exit.

Example:

holdup tcp://foobar:1234 -- django-admin ...

Documentation

https://python-holdup.readthedocs.io/

Development

To run all the tests run:

tox

Note, to combine the coverage data from all the tox environments run:

Windows

set PYTEST_ADDOPTS=--cov-append
tox

Other

PYTEST_ADDOPTS=--cov-append tox

Changelog

5.1.1 (2024-05-21)

  • Do not display an authentication mask for http protocols if there are no actual credentials specified.

5.1.0 (2024-04-12)

  • Fixed buggy handling when http checks are specified with a port.

  • Changed User-Agent header and stripped port from Host header for http checks.

  • Refactored a bunch of code into a separate holdup.checks module.

5.0.0 (2024-04-11)

  • Added a static binary in the Github release (built with Pyinstaller on Alpine, as a static bin).

  • Dropped support for Python 3.7 and added in Python 3.12 in the test suite.

4.0.0 (2023-02-14)

  • Added support for psycopg 3 (now the holdup[pg] extra will require that). The old psycopg2 is still supported for now.

  • Dropped support for Python 3.6 and added in Python 3.11 in the test suite.

3.0.0 (2022-03-20)

  • Dropped support for Python 2.

  • Switched CI from Travis to GitHub Actions.

  • Fixed bugs with password masking (it wasn’t working for postgresql URIs).

2.0.0 (2021-04-08)

  • Added support for password masking (--verbose-passwords to disable this feature).

  • Overhauled checks display a bit, output might be slightly different.

  • Added support for basic and digest HTTP authentication.

  • Published Docker image at https://hub.docker.com/r/ionelmc/holdup (Alpine based).

1.9.0 (2021-01-11)

  • Added a --version argument.

  • Changed verbose output to mask passwords in postgresql checks.

1.8.1 (2020-12-16)

  • Add support for PostgreSQL 12+ clients (strict integer type-checking on connect_timeout). The float is now converted to an integer.

1.8.0 (2019-05-28)

  • Added a PostgreSQL check. It handles the the database system is starting up problem. Contributed by Dan Ailenei in 6.

  • Changed output so it’s more clear and more brief:

    • arguments (checks) are quoted when printed,

    • “any” checks give exact info about what made it pass,

    • repetitive information is removed.

  • Simplified the internals for the “AnyCheck”.

1.7.0 (2018-11-24)

  • Added support for skipping SSL certificate verification for HTTPS services (the --insecure option and https+insecure protocol). Contributed by Mithun Ayachit in 2.

1.6.0 (2018-03-22)

  • Added verbose mode (-v or --verbose).

  • Changed default timeout to 60s (from 5s).

1.5.0 (2017-06-07)

  • Added an eval://expression protocol for weird user-defined checks.

1.4.0 (2017-03-27)

  • Added support for HTTP(S) check.

1.3.0 (2017-02-21)

  • Add support for “any” service check (service syntax with comma).

1.2.1 (2016-06-17)

  • Handle situation where internal operations would take more than planned.

1.2.0 (2016-05-25)

  • Added a file check.

1.1.0 (2016-05-06)

  • Removed debug print.

  • Added --interval option for how often to check. No more spinloops.

1.0.0 (2016-04-22)

  • Improved tests.

  • Always log to stderr.

0.1.0 (2016-04-21)

  • First release on PyPI.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page