diff --git a/README.md b/README.md index f9bcdcb..d37a11e 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,13 @@ This container is a stand-in till there is native support for `--exit-on-unhealt - [`1.1.0` (*Dockerfile*)](https://github.com/willfarrell/docker-autoheal/blob/1.1.0/Dockerfile) - [`v0.7.0` (*Dockerfile*)](https://github.com/willfarrell/docker-autoheal/blob/v0.7.0/Dockerfile) + ![](https://img.shields.io/docker/pulls/willfarrell/autoheal "Total docker pulls") [![](https://images.microbadger.com/badges/image/willfarrell/autoheal.svg)](http://microbadger.com/images/willfarrell/autoheal "Docker layer breakdown") ## How to use -### UNIX socket passthrough + +### 1. Docker CLI +#### UNIX socket passthrough ```bash docker run -d \ --name autoheal \ @@ -21,59 +24,99 @@ docker run -d \ -v /var/run/docker.sock:/var/run/docker.sock \ willfarrell/autoheal ``` -### TCP socket +#### TCP socket ```bash docker run -d \ --name autoheal \ --restart=always \ -e AUTOHEAL_CONTAINER_LABEL=all \ - -e DOCKER_SOCK=tcp://HOST:PORT \ + -e DOCKER_SOCK=tcp://$HOST:$PORT \ -v /path/to/certs/:/certs/:ro \ willfarrell/autoheal ``` -a) Apply the label `autoheal=true` to your container to have it watched. - -b) Set ENV `AUTOHEAL_CONTAINER_LABEL=all` to watch all running containers. - -c) Set ENV `AUTOHEAL_CONTAINER_LABEL` to existing label name that has the value `true`. - -Note: You must apply `HEALTHCHECK` to your docker images first. See https://docs.docker.com/engine/reference/builder/#healthcheck for details. -See https://docs.docker.com/engine/security/https/ for how to configure TCP with mTLS - -The certificates, and keys need these names: +#### TCP with mTLS (HTTPS) +```bash +docker run -d \ + --name autoheal \ + --restart=always \ + --tlscacert=/certs/ca.pem \ + --tlscert=/certs/client-cert.pem \ + --tlskey=/certs/client-key.pem \ + -e AUTOHEAL_CONTAINER_LABEL=all \ + -e DOCKER_HOST=tcp://$HOST:2376 \ + -e DOCKER_SOCK=tcps://$HOST:2376 \ + -e DOCKER_TLS_VERIFY=1 \ + -v /path/to/certs/:/certs/:ro \ + willfarrell/autoheal +``` +The certificates and keys need these names and resides under /certs inside the container: * ca.pem * client-cert.pem * client-key.pem +> See https://docs.docker.com/engine/security/https/ for how to configure TCP with mTLS + ### Change Timezone If you need the timezone to match the local machine, you can map the `/etc/localtime` into the container. -``` +```bash docker run ... -v /etc/localtime:/etc/localtime:ro ``` +### 2. Use in your container image +Choose one of the three alternatives: -## ENV Defaults -``` -AUTOHEAL_CONTAINER_LABEL=autoheal -AUTOHEAL_INTERVAL=5 # check every 5 seconds -AUTOHEAL_START_PERIOD=0 # wait 0 seconds before first health check -AUTOHEAL_DEFAULT_STOP_TIMEOUT=10 # Docker waits max 10 seconds (the Docker default) for a container to stop before killing during restarts (container overridable via label, see below) -DOCKER_SOCK=/var/run/docker.sock # Unix socket for curl requests to Docker API -CURL_TIMEOUT=30 # --max-time seconds for curl requests to Docker API -WEBHOOK_URL="" # post message to the webhook if a container was restarted (or restart failed) -``` +a) Apply the label `autoheal=true` to your container to have it watched;
+b) Set ENV `AUTOHEAL_CONTAINER_LABEL=all` to watch all running containers;
+c) Set ENV `AUTOHEAL_CONTAINER_LABEL` to existing container label that has the value `true`;
-### Optional Container Labels -``` -autoheal.stop.timeout=20 # Per containers override for stop timeout seconds during restart +> Note: You must apply `HEALTHCHECK` to your docker images first.
+> See https://docs.docker.com/engine/reference/builder/#healthcheck for details. + +#### Docker Compose (example) +```yaml +services: + app: + extends: + file: ${PWD}/services.yml + service: app + labels: + autoheal-app: true + + autoheal: + deploy: + replicas: 1 + environment: + AUTOHEAL_CONTAINER_LABEL: autoheal-app + image: willfarrell/autoheal:latest + network_mode: none + restart: always + volumes: + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock ``` -## Testing +#### Optional Container Labels +|`autoheal.stop.timeout=20` |Per containers override for stop timeout seconds during restart| +| --- | --- | + +## Environment Defaults +|Variable |Description| +| --- | --- | +|`AUTOHEAL_CONTAINER_LABEL=autoheal` |set to existing label name that has the value `true`| +|`AUTOHEAL_INTERVAL=5` |check every 5 seconds| +|`AUTOHEAL_START_PERIOD=0` |wait 0 seconds before first health check| +|`AUTOHEAL_DEFAULT_STOP_TIMEOUT=10` |Docker waits max 10 seconds (the Docker default) for a container to stop before killing during restarts (container overridable via label, see below)| +|`AUTOHEAL_ONLY_MONITOR_RUNNING=false` |All containers monitored by default. Set this to true to only monitor running containers. This will result in Paused contaners being ignored.| +|`DOCKER_SOCK=/var/run/docker.sock` |Unix socket for curl requests to Docker API| +|`CURL_TIMEOUT=30` |--max-time seconds for curl requests to Docker API| +|`WEBHOOK_URL=""` |post message to the webhook if a container was restarted (or restart failed)| + +## Testing (building locally) ```bash -docker build -t autoheal . +docker buildx build -t autoheal . docker run -d \ -e AUTOHEAL_CONTAINER_LABEL=all \ -v /var/run/docker.sock:/var/run/docker.sock \ - autoheal + autoheal ``` diff --git a/docker-entrypoint b/docker-entrypoint index e171e52..cdff426 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -29,6 +29,13 @@ AUTOHEAL_CONTAINER_LABEL=${AUTOHEAL_CONTAINER_LABEL:-autoheal} AUTOHEAL_START_PERIOD=${AUTOHEAL_START_PERIOD:-0} AUTOHEAL_INTERVAL=${AUTOHEAL_INTERVAL:-5} AUTOHEAL_DEFAULT_STOP_TIMEOUT=${AUTOHEAL_DEFAULT_STOP_TIMEOUT:-10} +AUTOHEAL_ONLY_MONITOR_RUNNING=${AUTOHEAL_ONLY_MONITOR_RUNNING:-false} + +echo AUTOHEAL_CONTAINER_LABEL=${AUTOHEAL_CONTAINER_LABEL} +echo AUTOHEAL_START_PERIOD=${AUTOHEAL_START_PERIOD} +echo AUTOHEAL_INTERVAL=${AUTOHEAL_INTERVAL} +echo AUTOHEAL_DEFAULT_STOP_TIMEOUT=${AUTOHEAL_DEFAULT_STOP_TIMEOUT} +echo AUTOHEAL_ONLY_MONITOR_RUNNING=${AUTOHEAL_ONLY_MONITOR_RUNNING} docker_curl() { curl --max-time "${CURL_TIMEOUT}" --no-buffer -s \ @@ -40,6 +47,7 @@ docker_curl() { # shellcheck disable=2039 get_container_info() { local label_filter + local running_filter local url # Set container selector @@ -49,7 +57,13 @@ get_container_info() { else label_filter=",\"label\":\[\"${AUTOHEAL_CONTAINER_LABEL}=true\"\]" fi - url="${HTTP_ENDPOINT}/containers/json?filters=\{\"health\":\[\"unhealthy\"\]${label_filter}\}" + if [ "$AUTOHEAL_ONLY_MONITOR_RUNNING" = false ] + then + running_filter="" + else + running_filter=",\"status\":\[\"running\"\]" + fi + url="${HTTP_ENDPOINT}/containers/json?filters=\{\"health\":\[\"unhealthy\"\]${label_filter}${running_filter}\}" docker_curl "$url" }