Restart your unhealthy containers safely
- Restart unhealthy containers marked with
deunhealth.restart.on.unhealthy=true
label - Receive Docker events as stream instead of polling periodically
- Doesn't need network for security purposes
- Compatible with
amd64
,386
,arm64
,arm32v7
,arm32v6
,ppc64le
,s390x
andriscv64
CPU architectures - Docker image tags and sizes
-
Use the following command:
docker run -d --network none -v /var/run/docker.sock:/var/run/docker.sock qmcgaw/deunhealth
You can also use docker-compose.yml with:
docker-compose up -d
-
Set labels on containers:
- To restart containers if they go unhealthy, use the label
deunhealth.restart.on.unhealthy=true
- To restart another container, when an unhealthy one is restarted by deunhealth, use the label
deunhealth.restart.with.unhealthy.container=<deunhealth-monitored container name>
- To restart containers if they go unhealthy, use the label
-
You can update the image with
docker pull qmcgaw/deunhealth:latest
or use one of the tags available.⚠️ You might want to use tagged images sincelatest
will likely break compatibility until we reach av1.0.0
release.
Environment variable | Default | Possible values | Description |
---|---|---|---|
DOCKER_HOST |
Default Docker socket location | Docker host value | Docker host value such as unix:///var/run/docker.sock or tcp://socket-proxy:2375 |
LOG_LEVEL |
info |
debug , info , warning , error |
Logging level |
HEALTH_SERVER_ADDRESS |
127.0.0.1:9999 |
Valid address | Health server listening address |
TZ |
America/Montreal |
string | Timezone |
- The application doesn't need network to reduce the attack surface
- Since Docker is written in Go, the program is also written in Go and uses the official Docker Go API
- The Docker container is based on scratch to reduce the attack surface and only contains the static binary
- The container has to run as root unfortunately 😢
Please refer to the corresponding readme.
-
Install Go dependencies with
go mod download
-
Install golangci-lint
-
You might want to use an editor such as Visual Studio Code with the Go extension.
# Build the binary
go build cmd/app/main.go
# Test the code
go test ./...
# Lint the code
golangci-lint run
# Build the Docker image
docker build -t qmcgaw/deunhealth .
See Contributing for more information on how to contribute to this repository.
- Trigger mechanism such that a container restart triggers other restarts
- Inject pre-build binary doing a DNS lookup to containers labeled for it and that do not have a healthcheck built in (useful for scratch based images without healthcheck especially)
- Integration tests in Go instead of shell script