Updated restic-auto with the docker command

This commit is contained in:
2021-02-20 15:37:06 +01:00
parent 523c8937e9
commit 99b37ea880
2 changed files with 22 additions and 28 deletions

View File

@@ -13,7 +13,7 @@ FROM alpine:latest
COPY --from=builder restic /usr/bin/ COPY --from=builder restic /usr/bin/
RUN apk add --no-cache bash curl jq openssh-client dcron tzdata RUN apk add --no-cache bash curl jq openssh-client dcron tzdata docker
COPY restic-auto docker-entrypoint.sh docker-command.sh /usr/local/bin/ COPY restic-auto docker-entrypoint.sh docker-command.sh /usr/local/bin/

View File

@@ -32,17 +32,17 @@ count_success=0
count_failure=0 count_failure=0
# List all the containers # List all the containers
containers=$(curl -s --unix-socket /var/run/docker.sock http:/v1.26/containers/json) for container_id in $(docker ps -aq) ; do
for container_id in $(echo $containers | jq ".[].Id") ; do container_json=$(docker inspect $container_id)
container=$(echo $containers | jq -c ".[] | select(.Id==$container_id)")
# Get the name and namespace (in case of a container run in a swarm stack) # Get the name and namespace (in case of a container run in a swarm stack)
container_name=$(echo $container | jq -r ".Names | .[0]" | cut -d'.' -f1 | cut -d'/' -f2) container_name=$(echo $container_json | jq -r '.[].Name' | cut -d'/' -f2)
namespace=$(echo $container | jq -r ".Labels | .[\"com.docker.stack.namespace\"]") # namespace=$(echo $container | jq -r ".Labels | .[\"com.docker.stack.namespace\"]")
# Backup the dirs labelled with "napnap75.backup.dirs" # Backup the dirs labelled with "napnap75.backup.dirs"
if $(echo $container | jq ".Labels | has(\"napnap75.backup.dirs\")") ; then
for dir_name in $(echo $container | jq -r ".Labels | .[\"napnap75.backup.dirs\"]") ; do backup_dirs=$(echo $container_json | jq -r '.[].Config.Labels."napnap75.backup.dirs"')
if [ "$backup_dirs" != "null" ] ; then
for dir_name in $backup_dirs ; do
echo "[INFO] Backing up dir" $dir_name "for container" $container_name echo "[INFO] Backing up dir" $dir_name "for container" $container_name
backup_dir $dir_name backup_dir $dir_name
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
@@ -54,10 +54,11 @@ for container_id in $(echo $containers | jq ".[].Id") ; do
fi fi
# Backup the volumes labelled with "napnap75.backup.volumes" # Backup the volumes labelled with "napnap75.backup.volumes"
if $(echo $container | jq ".Labels | has(\"napnap75.backup.volumes\")") ; then backup_volumes=$(echo $container_json | jq -r '.[].Config.Labels."napnap75.backup.volumes"')
for volume_name in $(echo $container | jq -r ".Labels | .[\"napnap75.backup.volumes\"]") ; do if [ "$backup_volumes" != "null" ] ; then
if [ $namespace != "null" ] ; then volume_name="${namespace}_${volume_name}" ; fi for volume_name in $backup_volumes ; do
volume_mount=$(echo $container | jq -r ".Mounts[] | select(.Name==\"$volume_name\") | .Source") # if [ $namespace != "null" ] ; then volume_name="${namespace}_${volume_name}" ; fi
volume_mount=$(echo $container_json | jq -r ".[].Mounts[] | select(.Name==\"$volume_name\") | .Source")
echo "[INFO] Backing up volume" $volume_name "with mount" $volume_mount "for container" $container_name echo "[INFO] Backing up volume" $volume_name "with mount" $volume_mount "for container" $container_name
backup_dir $volume_mount backup_dir $volume_mount
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
@@ -69,31 +70,24 @@ for container_id in $(echo $containers | jq ".[].Id") ; do
fi fi
# Backup the databases labelled with "napnap75.backup.databases" # Backup the databases labelled with "napnap75.backup.databases"
if $(echo $container | jq ".Labels | has(\"napnap75.backup.databases\")") ; then backup_databases=$(echo $container_json | jq -r '.[].Config.Labels."napnap75.backup.databases"')
container_id=$(echo $container_id | sed "s/\"//g") if [ "$backup_databases" != "null" ] ; then
database_password=$(curl -s --unix-socket /var/run/docker.sock http:/v1.26/containers/$container_id/json | jq -r ".Config.Env[] | match(\"MYSQL_ROOT_PASSWORD=(.*)\") | .captures[0].string") for database_name in $backup_databases ; do
for database_name in $(echo $container | jq -r ".Labels | .[\"napnap75.backup.databases\"]") ; do
echo "[INFO] Backing up database" $database_name "for container" $container_name echo "[INFO] Backing up database" $database_name "for container" $container_name
if [[ "$database_password" != "" ]] ; then docker exec $container_id bash -c "mysqldump --databases $database_name | gzip -c > /tmp/database_backup.sql.gz"
exec_id=$(curl -s --unix-socket /var/run/docker.sock -X POST -H "Content-Type: application/json" -d '{"AttachStdout":true,"AttachStderr":true,"Tty":true,"Cmd":["/bin/bash", "-c", "mysqldump -p'$database_password' --databases '$database_name'"]}' http:/v1.26/containers/$container_id/exec | jq ".Id" | sed "s/\"//g") if [ $? -ne 0 ]; then
else
exec_id=$(curl -s --unix-socket /var/run/docker.sock -X POST -H "Content-Type: application/json" -d '{"AttachStdout":true,"AttachStderr":true,"Tty":true,"Cmd":["/bin/bash", "-c", "mysqldump --databases '$database_name'"]}' http:/v1.26/containers/$container_id/exec | jq ".Id" | sed "s/\"//g")
fi
curl -s --unix-socket /var/run/docker.sock -X POST -H "Content-Type: application/json" -d '{"Detach":false,"Tty":false}' http:/v1.26/exec/$exec_id/start | gzip > /tmp/database_backup.gz
exit_code=$(curl -s --unix-socket /var/run/docker.sock http:/v1.26/exec/$exec_id/json | jq ".ExitCode")
if [ $exit_code -ne 0 ]; then
echo "[ERROR] Unable to backup database $database_name from container $container_name" echo "[ERROR] Unable to backup database $database_name from container $container_name"
cat /tmp/database_backup.gz | gzip -d
((++count_failure)) ((++count_failure))
else else
backup_file /tmp/database_backup.gz ${container_name}—${database_name}.sql.gz container_overlay=$(echo $container_json | jq -r '.[].GraphDriver.Data.MergedDir')
backup_file /root_fs${container_overlay}/tmp/database_backup.sql.gz ${container_name}—${database_name}.sql.gz
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
((++count_failure)) ((++count_failure))
else else
((++count_success)) ((++count_success))
fi fi
fi fi
rm /tmp/database_backup.gz docker exec $container_id bash -c "rm /tmp/database_backup.sql.gz"
done done
fi fi
done done