Moby Ryuk

October 23, 2024 ยท View on GitHub

This project helps you to remove containers, networks, volumes and images by given filter after specified delay.

Building

To build the binary only run:

go build

To build the Linux docker container as the latest tag:

docker build -f linux/Dockerfile -t testcontainers/ryuk:latest .

Usage

To start it using the default settings:

docker run -v /var/run/docker.sock:/var/run/docker.sock -p 8080:8080 testcontainers/ryuk:latest

If you want to test local changes with the default settings:

go run .

You can then simulate a connection from testcontainer container using:

nc -N localhost 8080 << EOF
label=testing=true&label=testing.sessionid=mysession
label=something
EOF

You can send additional session information for monitoring using:

printf "label=something_else" | nc -N localhost 8080

In the ryuk window you'll see containers/networks/volumes deleted after 10s

time=2024-09-30T19:42:30.000+01:00 level=INFO msg=starting connection_timeout=1m0s reconnection_timeout=10s request_timeout=10s shutdown_timeout=10m0s remove_retries=10 retry_offset=-1s changes_retry_interval=1s port=8080 verbose=false
time=2024-09-30T19:42:30.001+01:00 level=INFO msg="Started"
time=2024-09-30T19:42:30.001+01:00 level=INFO msg="client processing started"
time=2024-09-30T19:42:38.002+01:00 level=INFO msg="client connected" address=127.0.0.1:56432 clients=1
time=2024-09-30T19:42:38.002+01:00 level=INFO msg="adding filter" type=label values="[testing=true testing.sessionid=mysession]"
time=2024-09-30T19:42:38.002+01:00 level=INFO msg="adding filter" type=label values=[something]
time=2024-09-30T19:42:38.002+01:00 level=INFO msg="client disconnected" address=127.0.0.1:56432 clients=0
time=2024-09-30T19:42:42.047+01:00 level=INFO msg="adding filter" type=label values=[something_else]
time=2024-09-30T19:42:42.047+01:00 level=INFO msg="client connected" address=127.0.0.1:56434 clients=1
time=2024-09-30T19:42:42.047+01:00 level=INFO msg="client disconnected" address=127.0.0.1:56434 clients=0
time=2024-09-30T19:42:52.051+01:00 level=INFO msg="prune check" clients=0
time=2024-09-30T19:42:52.216+01:00 level=INFO msg="client processing stopped"
time=2024-09-30T19:42:52.216+01:00 level=INFO msg=removed containers=0 networks=0 volumes=0 images=0
time=2024-09-30T19:42:52.216+01:00 level=INFO msg=done

Ryuk configuration

The following environment variables can be configured to change the behaviour:

Environment VariableDefaultFormatDescription
RYUK_CONNECTION_TIMEOUT60sDurationThe duration without receiving any connections which will trigger a shutdown
RYUK_PORT8080uint16The port to listen on for connections
RYUK_RECONNECTION_TIMEOUT10sDurationThe duration after the last connection closes which will trigger resource clean up and shutdown
RYUK_REQUEST_TIMEOUT10sDurationThe timeout for any Docker requests
RYUK_REMOVE_RETRIES10intThe number of times to retry removing a resource
RYUK_RETRY_OFFSET-1sDurationThe offset added to the start time of the prune pass that is used as the minimum resource creation time. Any resource created after this calculated time will trigger a retry to ensure in use resources are not removed
RYUK_CHANGES_RETRY_INTERVAL1sDurationThe internal between retries if resource changes (containers, networks, images, and volumes) are detected while pruning
RYUK_VERBOSEfalseboolWhether to enable verbose aka debug logging
RYUK_SHUTDOWN_TIMEOUT10mDurationThe duration after shutdown has been requested when the remaining connections are ignored and prune checks start