Skip to content

Instantly share code, notes, and snippets.

@viiftw
Forked from pirate/docker-compose-backup.sh
Created January 20, 2021 04:04
Show Gist options
  • Select an option

  • Save viiftw/8ab7bea10e350c352e5294d70819e77b to your computer and use it in GitHub Desktop.

Select an option

Save viiftw/8ab7bea10e350c352e5294d70819e77b to your computer and use it in GitHub Desktop.

Revisions

  1. @pirate pirate revised this gist Nov 15, 2020. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion docker-compose-backup.sh
    Original file line number Diff line number Diff line change
    @@ -32,7 +32,7 @@ echo "[+] Backing up $project_name project to $backup_dir"
    mkdir -p "$backup_dir"

    echo " - Saving docker-compose.yml config"
    cp "$project_dir/docker-compose.yml" > "$backup_dir/docker-compose.yml"
    cp "$project_dir/docker-compose.yml" "$backup_dir/docker-compose.yml"


    # Optional: run a command inside the contianer to dump your application's state/database to a stable file
  2. @pirate pirate revised this gist Sep 2, 2020. 1 changed file with 43 additions and 20 deletions.
    63 changes: 43 additions & 20 deletions docker-compose-backup.sh
    Original file line number Diff line number Diff line change
    @@ -1,16 +1,28 @@
    #!/usr/bin/env bash
    # Fully backup a docker-compose project, including all images, named and unnamed volumes, container filesystems, config, logs, and databases.

    project_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
    cd "$project_dir"
    ### Bash Environment Setup
    # http://redsymbol.net/articles/unofficial-bash-strict-mode/
    # https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
    # set -o xtrace
    set -o errexit
    set -o errtrace
    set -o nounset
    set -o pipefail
    IFS=$'\n'

    # Fully backup a docker-compose project, including all images, named and unnamed volumes, container filesystems, config, logs, and databases.
    project_dir="${1:-$PWD}"
    if [ -f "$project_dir/docker-compose.yml" ]; then
    echo "[i] Found docker-compose config at $project_dir/docker-compose.yml"
    else
    echo "[X] Could not find a docker-compose.yml file in $project_dir"
    exit 1
    fi

    project_name=$(basename "$project_dir")
    backup_time=$(date +"%Y-%m-%d_%H-%M")
    backup_dir="$project_dir/data/backups/$backup_time"

    # Optionally pause the containers
    # docker-compose pause

    # Source any needed environment variables
    [ -f "$project_dir/docker-compose.env" ] && source "$project_dir/docker-compose.env"
    [ -f "$project_dir/.env" ] && source "$project_dir/.env"
    @@ -19,31 +31,46 @@ backup_dir="$project_dir/data/backups/$backup_time"
    echo "[+] Backing up $project_name project to $backup_dir"
    mkdir -p "$backup_dir"

    echo " - Saving config to ./docker-compose.yml"
    docker-compose config > "$backup_dir/docker-compose.yml" || exit 1
    echo " - Saving docker-compose.yml config"
    cp "$project_dir/docker-compose.yml" > "$backup_dir/docker-compose.yml"


    # save database dump files
    echo " - Saving database dumps to ./dumps"
    # Optional: run a command inside the contianer to dump your application's state/database to a stable file
    echo " - Saving application state to ./dumps"
    mkdir -p "$backup_dir/dumps"
    # your database/stateful service export commands go here, e.g.
    # docker-compose exec postgresql env PGPASSWORD="$POSTGRES_PASSWORD" pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" | gzip -9 > "$backup_dir/dumps/$POSTGRES_DB.sql.gz"
    # your database/stateful service export commands to run inside docker go here, e.g.
    # docker-compose exec postgres env PGPASSWORD="$POSTGRES_PASSWORD" pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" | gzip -9 > "$backup_dir/dumps/$POSTGRES_DB.sql.gz"
    # docker-compose exec redis redis-cli SAVE
    # docker-compose exec redis cat /data/dump.rdb | gzip -9 > "$backup_dir/dumps/redis.rdb.gz"

    # Optional: pause the containers before backing up to ensure consistency
    # docker-compose pause

    for service_name in $(docker-compose config --services); do
    image_id=$(docker-compose images -q "$service_name")
    image_name=$(docker image inspect --format '{{json .RepoTags}}' "$image_id" | jq -r '.[0]')
    container_id=$(docker-compose ps -q "$service_name")
    image_name=$(docker inspect -f "{{ .Config.Image }}" "$container_id")
    image_id=$(docker image ls -q "$image_name")

    service_dir="$backup_dir/$service_name"
    echo "[*] Backing up ${project_name}__${service_name} to ./$service_name..."
    mkdir -p "$service_dir"

    # save image
    echo " - Saving $image_name image to ./$service_name/image.tar"
    docker save --output "$service_dir/image.tar" "$image_id"

    if [[ -z "$container_id" ]]; then
    echo " - Warning: $service_name has no container yet."
    echo " (has it been started at least once?)"
    continue
    fi

    # save config
    echo " - Saving config to ./$service_name/config.json"
    echo " - Saving container config to ./$service_name/config.json"
    docker inspect "$container_id" > "$service_dir/config.json"

    # save logs
    echo " - Saving logs to ./$service_name/docker.out/err"
    echo " - Saving stdout/stderr logs to ./$service_name/docker.{out,err}"
    docker logs "$container_id" > "$service_dir/docker.out" 2> "$service_dir/docker.err"

    # save data volumes
    @@ -54,10 +81,6 @@ for service_name in $(docker-compose config --services); do
    mkdir -p $(dirname "$volume_dir")
    cp -a -r "$source" "$volume_dir"
    done

    # save image
    echo " - Saving $image_name image to ./$service_name/image.tar"
    docker save --output "$service_dir/image.tar" "$image_id"

    # save container filesystem
    echo " - Saving container filesystem to ./$service_name/container.tar"
  3. @pirate pirate revised this gist Jul 3, 2019. 1 changed file with 0 additions and 1 deletion.
    1 change: 0 additions & 1 deletion docker-compose-backup.sh
    Original file line number Diff line number Diff line change
    @@ -27,7 +27,6 @@ docker-compose config > "$backup_dir/docker-compose.yml" || exit 1
    echo " - Saving database dumps to ./dumps"
    mkdir -p "$backup_dir/dumps"
    # your database/stateful service export commands go here, e.g.
    # docker-compose exec database pg_dump -U nextcloud nextcloud | gzip -9 > "$backup_dir/dumps/nextcloud.sql.gz"
    # docker-compose exec postgresql env PGPASSWORD="$POSTGRES_PASSWORD" pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" | gzip -9 > "$backup_dir/dumps/$POSTGRES_DB.sql.gz"

    for service_name in $(docker-compose config --services); do
  4. @pirate pirate revised this gist Jul 3, 2019. 1 changed file with 12 additions and 1 deletion.
    13 changes: 12 additions & 1 deletion docker-compose-backup.sh
    Original file line number Diff line number Diff line change
    @@ -8,6 +8,14 @@ project_name=$(basename "$project_dir")
    backup_time=$(date +"%Y-%m-%d_%H-%M")
    backup_dir="$project_dir/data/backups/$backup_time"

    # Optionally pause the containers
    # docker-compose pause

    # Source any needed environment variables
    [ -f "$project_dir/docker-compose.env" ] && source "$project_dir/docker-compose.env"
    [ -f "$project_dir/.env" ] && source "$project_dir/.env"


    echo "[+] Backing up $project_name project to $backup_dir"
    mkdir -p "$backup_dir"

    @@ -20,7 +28,7 @@ echo " - Saving database dumps to ./dumps"
    mkdir -p "$backup_dir/dumps"
    # your database/stateful service export commands go here, e.g.
    # docker-compose exec database pg_dump -U nextcloud nextcloud | gzip -9 > "$backup_dir/dumps/nextcloud.sql.gz"

    # docker-compose exec postgresql env PGPASSWORD="$POSTGRES_PASSWORD" pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" | gzip -9 > "$backup_dir/dumps/$POSTGRES_DB.sql.gz"

    for service_name in $(docker-compose config --services); do
    container_id=$(docker-compose ps -q "$service_name")
    @@ -65,3 +73,6 @@ echo "[*] Compressing backup folder to $backup_dir.tar.gz"
    tar -zcf "$backup_dir.tar.gz" --totals "$backup_dir" && rm -Rf "$backup_dir"

    echo "[√] Finished Backing up $project_name to $backup_dir.tar.gz."

    # Resume the containers if paused above
    # docker-compose unpause
  5. @pirate pirate revised this gist Jul 3, 2019. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion docker-compose-backup.sh
    Original file line number Diff line number Diff line change
    @@ -62,6 +62,6 @@ for service_name in $(docker-compose config --services); do
    done

    echo "[*] Compressing backup folder to $backup_dir.tar.gz"
    tar --totals -zcf "$backup_dir.tar.gz" "$backup_dir" && rm -Rf "$backup_dir"
    tar -zcf "$backup_dir.tar.gz" --totals "$backup_dir" && rm -Rf "$backup_dir"

    echo "[√] Finished Backing up $project_name to $backup_dir.tar.gz."
  6. @pirate pirate revised this gist Jul 3, 2019. 1 changed file with 5 additions and 4 deletions.
    9 changes: 5 additions & 4 deletions docker-compose-backup.sh
    Original file line number Diff line number Diff line change
    @@ -1,25 +1,26 @@
    #!/usr/bin/env bash
    # Fully backup a docker-compose project, including all images, named and unnamed volumes, container filesystems, config, logs, and databases.


    project_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
    cd "$project_dir"

    project_name=$(basename "$project_dir")
    backup_time=$(date +"%Y-%m-%d_%H-%M")
    backup_dir="$project_dir/data/backups/$backup_time"

    echo "[+] Backing up $project_name docker-compose project to $backup_dir..."
    echo "[+] Backing up $project_name project to $backup_dir"
    mkdir -p "$backup_dir"

    echo " - Saving config to ./docker-compose.yml"
    docker-compose config > "$backup_dir/docker-compose.yml" || exit 1


    # save database dump files
    echo " - Saving database dumps to $backup_dir/dumps"
    echo " - Saving database dumps to ./dumps"
    mkdir -p "$backup_dir/dumps"
    # your database/stateful service export commands go here, e.g.
    #docker-compose exec database pg_dump -U nextcloud nextcloud | gzip -9 > "$backup_dir/dumps/nextcloud.sql.gz"
    # docker-compose exec database pg_dump -U nextcloud nextcloud | gzip -9 > "$backup_dir/dumps/nextcloud.sql.gz"


    for service_name in $(docker-compose config --services); do
    container_id=$(docker-compose ps -q "$service_name")
  7. @pirate pirate revised this gist Jul 3, 2019. 1 changed file with 28 additions and 24 deletions.
    52 changes: 28 additions & 24 deletions docker-compose-backup.sh
    Original file line number Diff line number Diff line change
    @@ -1,62 +1,66 @@
    #!/usr/bin/env bash
    # Fully backup a docker-compose project, including all images, named and unnamed volumes, container filesystems, config, logs, and databases.


    project_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
    cd "$project_dir"

    project_name=$(basename "$project_dir")
    backup_time=$(date +"%Y-%m-%d_%H:%M")
    backup_time=$(date +"%Y-%m-%d_%H-%M")
    backup_dir="$project_dir/data/backups/$backup_time"

    echo "[+] Backing up $project_name docker-compose project to $backup_dir..."
    mkdir -p "$backup_dir"

    # save database dump file
    echo " - Saving database dumps to $backup_dir/databases"
    mkdir -p "$backup_dir/databases"
    # your database/stateful service export commands go here, e.g.
    #docker-compose exec database pg_dump -U nextcloud nextcloud | gzip -9 > "$backup_dir/databases/nextcloud.sql.gz"
    echo " - Saving config to ./docker-compose.yml"
    docker-compose config > "$backup_dir/docker-compose.yml" || exit 1

    echo " - Saving config to $backup_dir/docker-compose.yml"
    docker-compose config > "$backup_dir/docker-compose.yml"
    # save database dump files
    echo " - Saving database dumps to $backup_dir/dumps"
    mkdir -p "$backup_dir/dumps"
    # your database/stateful service export commands go here, e.g.
    #docker-compose exec database pg_dump -U nextcloud nextcloud | gzip -9 > "$backup_dir/dumps/nextcloud.sql.gz"

    for service_name in $(docker-compose config --services); do
    container_id=$(docker-compose ps -q "$service_name")
    image_name=$(docker inspect -f "{{ .Config.Image }}" "$container_id")
    image_id=$(docker image ls -q "$image_name")

    service_dir="$backup_dir/$service_name"
    echo "[*] Backing up ${project_name}__${service_name} to $service_dir..."
    echo "[*] Backing up ${project_name}__${service_name} to ./$service_name..."
    mkdir -p "$service_dir"

    # save image
    echo " - Saving $image_name image to $service_dir/image.tar"
    docker save --output "$service_dir/image.tar" "$image_id"
    # save config
    echo " - Saving config to ./$service_name/config.json"
    docker inspect "$container_id" > "$service_dir/config.json"

    # save container filesystem
    echo " - Saving container filesystem to $service_dir/container.tar"
    docker export --output "$service_dir/container.tar" "$container_id"
    # save logs
    echo " - Saving logs to ./$service_name/docker.out/err"
    docker logs "$container_id" > "$service_dir/docker.out" 2> "$service_dir/docker.err"

    # save data volumes
    mkdir -p "$service_dir/volumes"
    for source in $(docker inspect -f '{{range .Mounts}}{{println .Source}}{{end}}' "$container_id"); do
    volume_dir="$service_dir/volumes$source"
    echo " - Saving $source volume to $volume_dir"
    echo " - Saving $source volume to ./$service_name/volumes$source"
    mkdir -p $(dirname "$volume_dir")
    cp -a -r "$source" "$volume_dir"
    done

    # save image
    echo " - Saving $image_name image to ./$service_name/image.tar"
    docker save --output "$service_dir/image.tar" "$image_id"

    # save logs
    echo " - Saving logs to $service_dir/docker.out/err"
    docker logs "$container_id" > "$service_dir/docker.out" 2> "$service_dir/docker.err"

    # save config
    echo " - Saving config to $service_dir/config.json"
    docker inspect "$container_id" > "$service_dir/config.json"
    # save container filesystem
    echo " - Saving container filesystem to ./$service_name/container.tar"
    docker export --output "$service_dir/container.tar" "$container_id"

    # save entire container root dir
    echo " - Saving container root to $service_dir/root"
    cp -a -r "/var/lib/docker/containers/$container_id" "$service_dir/root"
    done

    echo "[√] Finished Backing up $project_name to $backup_dir."
    echo "[*] Compressing backup folder to $backup_dir.tar.gz"
    tar --totals -zcf "$backup_dir.tar.gz" "$backup_dir" && rm -Rf "$backup_dir"

    echo "[√] Finished Backing up $project_name to $backup_dir.tar.gz."
  8. @pirate pirate created this gist Jul 3, 2019.
    62 changes: 62 additions & 0 deletions docker-compose-backup.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,62 @@
    #!/usr/bin/env bash
    # Fully backup a docker-compose project, including all images, named and unnamed volumes, container filesystems, config, logs, and databases.

    project_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
    cd "$project_dir"

    project_name=$(basename "$project_dir")
    backup_time=$(date +"%Y-%m-%d_%H:%M")
    backup_dir="$project_dir/data/backups/$backup_time"

    echo "[+] Backing up $project_name docker-compose project to $backup_dir..."
    mkdir -p "$backup_dir"

    # save database dump file
    echo " - Saving database dumps to $backup_dir/databases"
    mkdir -p "$backup_dir/databases"
    # your database/stateful service export commands go here, e.g.
    #docker-compose exec database pg_dump -U nextcloud nextcloud | gzip -9 > "$backup_dir/databases/nextcloud.sql.gz"

    echo " - Saving config to $backup_dir/docker-compose.yml"
    docker-compose config > "$backup_dir/docker-compose.yml"

    for service_name in $(docker-compose config --services); do
    container_id=$(docker-compose ps -q "$service_name")
    image_name=$(docker inspect -f "{{ .Config.Image }}" "$container_id")
    image_id=$(docker image ls -q "$image_name")

    service_dir="$backup_dir/$service_name"
    echo "[*] Backing up ${project_name}__${service_name} to $service_dir..."
    mkdir -p "$service_dir"

    # save image
    echo " - Saving $image_name image to $service_dir/image.tar"
    docker save --output "$service_dir/image.tar" "$image_id"

    # save container filesystem
    echo " - Saving container filesystem to $service_dir/container.tar"
    docker export --output "$service_dir/container.tar" "$container_id"

    # save data volumes
    mkdir -p "$service_dir/volumes"
    for source in $(docker inspect -f '{{range .Mounts}}{{println .Source}}{{end}}' "$container_id"); do
    volume_dir="$service_dir/volumes$source"
    echo " - Saving $source volume to $volume_dir"
    mkdir -p $(dirname "$volume_dir")
    cp -a -r "$source" "$volume_dir"
    done

    # save logs
    echo " - Saving logs to $service_dir/docker.out/err"
    docker logs "$container_id" > "$service_dir/docker.out" 2> "$service_dir/docker.err"

    # save config
    echo " - Saving config to $service_dir/config.json"
    docker inspect "$container_id" > "$service_dir/config.json"

    # save entire container root dir
    echo " - Saving container root to $service_dir/root"
    cp -a -r "/var/lib/docker/containers/$container_id" "$service_dir/root"
    done

    echo "[√] Finished Backing up $project_name to $backup_dir."