Runs healthchecks against local docker containers
- golang 1.22+
Add a healthcheck to an existing app.json file, specified by the --app-json flag. If the file does not exist, an empty app.json file will be assumed.
# creates a default startup uptime healthcheck
# docker-container-healthchecker add $PROCESS_TYPE
docker-container-healthchecker add webBy default, the output is written to stdout, though it can be written to the file specified via the --in-place flag.
docker-container-healthchecker add web --in-placeThe add command supports adding a listening check, which optionally supports a --port flag (default: 5000):
# listening check
docker-container-healthchecker add web --listening-check --port 3000After creating an app.json file, execute the healthchecker like so:
# docker-container-healthchecker check $CONTAINER_ID_OR_NAME
docker-container-healthchecker check cb0ce984f2aaBy default, the checks specified for the web process type are executed at the startup type level. If the process-type has no checks specified, a default uptime container check of 10 seconds is performed.
The convert command can be used to convert the CHECKS file format used by Dokku into the healthcheck format used by docker-container-healthchecker
docker-container-healthchecker convert path/to/CHECKSBy default, the output will be written to stdout. This output can be pretty printed using the --pretty flag:
docker-container-healthchecker convert path/to/CHECKS --prettyThe app.json in the current working directory is used as input. A different app.json file can also be updated by specifying the path to an app.json file via the --app-json flag. If the file does not exist, an error will be raised.
docker-container-healthchecker convert path/to/CHECKS --app.json path/to/app.jsonThe app.json file can also be modified in place instead of writing to stdout by specifying the --in-place flag. This also respects pretty printing via the --pretty flag.
docker-container-healthchecker convert path/to/CHECKS --pretty --inlineCheck if the app.json contains healthchecks for the specified process type:
docker-container-healthchecker exists webIf there are healthchecks, there will be no output and the exit code will be 0. An error message will be displayed and the exit code will be non-zero in all other cases.
The app.json in the current working directory is used as input. A different app.json file can also be checked by specifying the path to an app.json file via the --app-json flag. If the file does not exist, an error will be raised.
docker-container-healthchecker exists web --app.json path/to/app.jsonRuns a command within the specified container. If the command exits non-zero, the output is printed and the check is considered failed.
As the command type is run within the container environment, it can be used to perform dynamic checks using environment variables exposed to the container. For example, it may be used to simulate content checks on http endpoints like so:
#!/usr/bin/env bash
OUTPUT="$(curl http://localhost:$PORT/some-file.js)"
if ! grep jQuery <<< "$OUTPUT"; then
echo "Expected in output: jQuery"
echo "Output: $output"
exit 1
ficommand checks respect the attempts, timeout and wait properties.
If the command type is in use, the path and uptime healthcheck properties must be empty.
Checks to see if there is a container process listening on all interfaces for the specified port. This can be used to ensure external proxy implementations can connect to the underlying process.
listening checks respect the attempts and wait properties but does not respect the timeout property.
Executes an http request against the container at the specified path. The container IP address is fetched from the bridge network and the port is default to 5000, though both settings can be overridden by the --network and --port flags, respectively.
HTTP path checks respect the attempts, timeout and wait properties.
Custom headers may be specified for http path requests by utilizing the --header flag like so:
docker-container-healthchecker check cb0ce984f2aa --header 'X-Forwarded-Proto: https'To further customize the type of request performed, please see the command check type.
If the path type is in use, the command and uptime healthcheck properties must be empty.
Ensures the container is up for at least uptime in seconds. If a container has restarted at all during that time, it is treated as an unhealthy container.
uptime checks do not respect the attempts, timeout and wait properties.
If the uptime type is in use, the command and path healthcheck properties must be empty.
Healthchecks are defined within a json file and have the following properties (the respective scheduler properties are also noted for comparison):
| field | default | description | scheduler aliases (kubernetes, nomad) |
|---|---|---|---|
| attempts | default: 3 |
Number of retry attempts to perform on failure. | nomad=check_restart.limit |
| command | default: "" (empty string) |
Command to execute within container. | kubernetes=exec.Command nomad=command args |
| content | default: "" (empty string) |
Content to search in http path check output. | |
| httpHeaders | default: [] (for http checks) |
A list of headers (defined by name/value attributes) to add to a request. |
kubernetes=httpHeaders |
| initialDelay | default: 0, unit: seconds |
Number of seconds to wait after a container has started before triggering the healthcheck. | kubernetes=initialDelaySeconds nomad=check_restart.grace |
| listening | default: false |
Whether to perform a listening check or not. | |
| name | default: "" (autogenerated) |
The name of the healthcheck. If unspecified, it will be autogenerated from the rest of the healthcheck information. | nomad=name |
| scheme | default: http (for http checks) |
An http path to check. | kubernetes=scheme |
| path | default: / (for http checks) |
An http path to check. | kubernetes=httpGet.path nomad=path |
| port | default: 5000, unit: int |
Port to run healthcheck against. Overrides flag. | kubernetes=port |
| timeout | default: 5, unit: seconds |
Number of seconds to wait before timing out a healthcheck. | kubernetes=timeoutSeconds nomad=timeout |
| type | default: "" (none) |
Type of the healthcheck. Options: liveness, readiness, startup |
|
| uptime | default: "" (none) |
Amount of time the container must be alive before the container is considered healthy. Any restarts will cause this to check to fail, and this check does not respect retries. | |
| wait | default: 5, unit: seconds |
Number of seconds to wait between healthcheck attempts. | kubernetes=periodSeconds nomad=interval |
| warn | default: false |
Outputs a warning for the check but does not count failures against the service. |
Any extra properties are ignored
Healthchecks are specified within an app.json file grouped in a per process-type basis. One process type can have one or more healthchecks of various types.
{
"healthchecks": {
"web": [
{
"type": "startup",
"name": "web check",
"description": "Checking if the app responds to the /health/ready endpoint",
"path": "/health/ready",
"attempts": 3
}
]
}An example app.json is located in the tests/fixtures. Unknown keys are ignored, as in the above case with the description field.