summarylogtreecommitdiffstats
path: root/hooks_docker-btrfs
blob: 31efedf9ebc98f081cb1b3ece98d420819986c6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/bash

run_hook() {
    . /etc/docker-btrfs.sh
    docker_rwlayer=$(echo $rootflags | grep -o "subvol=[^,]*" | grep -o "[^=]*\$")

    mkdir -p /docker_root
    mkdir -p /var/lib/docker
    mkdir -p /top_layer

    msg ":: mounting "$root" at /docker_root"
    rootdev=$(resolve_device "$root") && root=$rootdev
    unset rootdev
    if ! mount -t btrfs "$root" "/docker_root"; then
        echo "You are now being dropped into an emergency shell."
        launch_interactive_shell
        msg "Trying to continue (this will most likely fail) ..."
    fi

    msg ":: bind mounting "/docker_root/$docker_path" at /var/lib/docker"
    if ! mount -o bind "/docker_root/$docker_path" "/var/lib/docker"; then
        echo "You are now being dropped into an emergency shell."
        launch_interactive_shell
        msg "Trying to continue (this will most likely fail) ..."
    fi

    msg ":: getting docker cache subvolume"
    cd /var/lib/docker/image/btrfs
    image_id=$(jq ".Repositories.\"$docker_image\".\"$docker_image:$docker_tag\"" repositories.json | sed 's/:/\//g;s/"//g')
    last_layer_id=$(jq '.rootfs.diff_ids[]' imagedb/content/$image_id | sed 's/"//g' | tail -n 1)
    cache_id_file=$(grep $last_layer_id -rl layerdb | sed 's/diff/cache-id/g')
    cache_id=$(cat $cache_id_file)

    msg ":: creating rwlayer"
    [ -d /docker_root/"$docker_rwlayer" ] && btrfs subvolume delete /docker_root/"$docker_rwlayer"
    if ! btrfs subvolume snapshot /var/lib/docker/btrfs/subvolumes/$cache_id /docker_root/"$docker_rwlayer"; then
        echo "You are now being dropped into an emergency shell."
        launch_interactive_shell
        msg "Trying to continue (this will most likely fail) ..."
    fi

    msg ":: mounting top layer drive"
    toplayerdev=$(resolve_device "$toplayer") && root=$toplayerdev
    unset toplayerdev
    if ! mount ${toplayerfstype:+-t $toplayerfstype} ${toplayerflags:+-o $toplayerflags} "$toplayer" "/top_layer"; then
        echo "You are now being dropped into an emergency shell."
        launch_interactive_shell
        msg "Trying to continue (this will most likely fail) ..."
    fi

    msg ":: applying top layer"
    cp -r /top_layer/"$toplayer_path"/* /docker_root/"$docker_rwlayer"/

    # cleaning
    cd /
    umount /top_layer
    umount /var/lib/docker
    umount /docker_root
}

# vim: set ft=sh ts=4 sw=4 et: