8567: Migrate unnamed images
[arvados.git] / docker / migrate-docker19 / migrate.sh
1 #!/bin/bash
2
3 # This script is called by arv-migrate-docker19 to perform the actual migration
4 # of a single image.  This works by running Docker-in-Docker (dnd.sh) to
5 # download the image using Docker 1.9 and then upgrading to Docker 1.13 and
6 # uploading the converted image.
7
8 # When using bash in pid 1 and using "trap on EXIT"
9 # it will sometimes go into an 100% CPU infinite loop.
10 #
11 # Using workaround from here:
12 #
13 # https://github.com/docker/docker/issues/4854
14 if [ "$$" = 1 ]; then
15   $0 "$@"
16   exit $?
17 fi
18
19 # -x           show script
20 # -e           exit on error
21 # -o pipefail  use exit code from 1st failure in pipeline, not last
22 set -x -e -o pipefail
23
24 image_tar_keepref=$1
25 image_id=$2
26 image_repo=$3
27 image_tag=$4
28 project_uuid=$5
29 graph_driver=$6
30
31 if [[ "$image_repo" = "<none>" ]] ; then
32   image_repo=none
33   image_tag=latest
34 fi
35
36 # Print free space in /var/lib/docker
37 function freespace() {
38     df -B1 /var/lib/docker | tail -n1 | sed 's/  */ /g' | cut -d' ' -f4
39 }
40
41 # Run docker-in-docker script and then wait for it to come up
42 function start_docker {
43     /root/dnd.sh $graph_driver &
44     for i in $(seq 1 10) ; do
45         if docker version >/dev/null 2>/dev/null ; then
46             return
47         fi
48         sleep 1
49     done
50     false
51 }
52
53 # Kill docker from pid then wait for it to be down
54 function kill_docker {
55     if test -f /var/run/docker.pid ; then
56         kill $(cat /var/run/docker.pid)
57     fi
58     for i in $(seq 1 10) ; do
59         if ! docker version >/dev/null 2>/dev/null ; then
60             return
61         fi
62         sleep 1
63     done
64     false
65 }
66
67 # Ensure that we clean up docker graph and/or lingering cache files on exit
68 function cleanup {
69     kill_docker
70     rm -rf /var/lib/docker/*
71     rm -rf /root/.cache/arvados/docker/*
72     echo "Available space after cleanup is $(freespace)"
73 }
74
75 trap cleanup EXIT
76
77 start_docker
78
79 echo "Initial available space is $(freespace)"
80
81 arv-get $image_tar_keepref | docker load
82
83
84 docker tag $image_id $image_repo:$image_tag
85
86 docker images -a
87
88 kill_docker
89
90 echo "Available space after image load is $(freespace)"
91
92 cd /root/pkgs
93 dpkg -i libltdl7_2.4.2-1.11+b1_amd64.deb docker-engine_1.13.1-0~debian-jessie_amd64.deb
94
95 echo "Available space after image upgrade is $(freespace)"
96
97 start_docker
98
99 docker images -a
100
101 if [[ "$image_repo" = "none" ]] ; then
102   image_repo=$(docker images -a --no-trunc | sed 's/  */ /g' | grep ^none | cut -d' ' -f3)
103   image_tag=""
104 fi
105
106 UUID=$(arv-keepdocker --force-image-format --project-uuid=$project_uuid $image_repo $image_tag)
107
108 echo "Available space after arv-keepdocker is $(freespace)"
109
110 echo "Migrated uuid is $UUID"