summarylogtreecommitdiffstats
path: root/hooks_docker-btrfs
blob: 3f764e95d7d816e77517746db5f8c2209fc5b248 (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
#!/usr/bin/bash

run_hook() {
    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"
    cache_id=$(get-docker-cache-id)

    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: