From 96d61fd6e03e9860bdc523efe1de128596a6fc6f Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 9 Aug 2022 11:02:47 +0200 Subject: [PATCH] feat: add support for labels to discover additional containers --- README.md | 9 ++++++++- dump.go | 6 ++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cdab28b..bb7e527 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,18 @@ Simply point it at your docker socket, mount a backup volume and be done: docker run -v $PWD/backups:/backups -v /var/run/docker.sock:/var/run/docker.sock kolaente/db-backup ``` -The tool will find all database containers and create backups of them periodically. It will also discover new containers +The tool will find all database containers running an official [`mysql`](https://hub.docker.com/_/mysql), +[`mariadb`](https://hub.docker.com/_/mariadb) or [`postgres`](https://hub.docker.com/_/postgres) image and +create backups of them periodically. It will also discover new containers as they are started and won't try to back up containers which have gone away. When running, all backups for the current run are time-stamped into a sub folder of the backup directory (see below). +### Using labels + +To make the backup tool discover other non-offical containers as well you can add the label `de.kolaente.db-backup` to +any container with a value of `mysql` or `postgres` to treat it as a mysql or postgres container. + ### Docker Compose If you're running docker-compose, you can use a setup similar to the following compose file to run the backup: diff --git a/dump.go b/dump.go index 8661cc7..c3a1caa 100644 --- a/dump.go +++ b/dump.go @@ -6,6 +6,8 @@ import ( "strings" ) +const containerLabelName = `de.kolaente.db-backup` + type Dumper interface { Dump(c *client.Client) error } @@ -13,11 +15,11 @@ type Dumper interface { func NewDumperFromContainer(container *types.ContainerJSON) Dumper { // Containers contain the tags, therefore we need to check them one by one - if strings.HasPrefix(container.Config.Image, "mysql") || strings.HasPrefix(container.Config.Image, "mariadb") { + if strings.HasPrefix(container.Config.Image, "mysql") || strings.HasPrefix(container.Config.Image, "mariadb") || container.Config.Labels[containerLabelName] == "mysql" { return NewMysqlDumper(container) } - if strings.HasPrefix(container.Config.Image, "postgres") { + if strings.HasPrefix(container.Config.Image, "postgres") || container.Config.Labels[containerLabelName] == "postgres" { return NewPostgresDumper(container) }