add a special env var DOCKER_HOST_IP to all images
[discourse_docker.git] / launcher
1 #!/bin/bash
2
3 command=$1
4 config=$2
5 config_file=containers/"$config".yml
6 cidfile=cids/"$config".cid
7 cidbootstrap=cids/"$config"_boostrap.cid
8 local_discourse=local_discourse
9 image=samsaffron/discourse
10 docker_path=`which docker`
11
12 docker_ip=`/sbin/ifconfig | \
13 grep -B1 "inet addr" | \
14 awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' | \
15 grep docker0 | \
16 awk -F: '{ print $3 }';`
17
18
19 usage () {
20 echo "Usage: launcher COMMAND CONFIG"
21 echo "Commands:"
22 echo " start: Start/initialize a container"
23 echo " stop: Stop a running container"
24 echo " restart: Restart a container"
25 echo " destroy: Stop and remove a container"
26 echo " ssh: Start a bash shell in a running container"
27 echo " logs: Docker logs for container"
28 echo " bootstrap: Bootstrap a container for the config based on a template"
29 exit 1
30 }
31
32 install_docker() {
33
34 echo "Docker is not installed, make sure you are running on the 3.8 kernel"
35 echo "The best supported Docker release is Ubuntu 12.04.03 for it run the following"
36 echo
37 echo "sudo apt-get update"
38 echo "sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring"
39 echo "sudo reboot"
40 echo
41
42 echo "sudo sh -c \"wget -qO- https://get.docker.io/gpg | apt-key add -\""
43 echo "sudo sh -c \"echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list\""
44 echo "sudo apt-get update"
45 echo "sudo apt-get install lxc-docker"
46
47 exit 1
48 }
49
50 set_volumes() {
51 volumes=`cat $config_file | docker run -rm -i -a stdout -a stdin $image ruby -e \
52 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
53 }
54
55 [ -z $docker_path ] && {
56 install_docker
57 }
58
59
60 [ $# -ne 2 ] && {
61 usage
62 }
63
64 if [ ! -e $config_file ]
65 then
66 echo "Config file was not found, ensure $config_file exists"
67 exit 1
68 fi
69
70 case "$command" in
71 bootstrap)
72
73 templates=`cat $config_file | docker run -rm -i -a stdin -a stdout $image ruby -e \
74 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
75
76 arrTemplates=(${templates// / })
77 config_data=$(cat $config_file)
78 input="hack: true"
79
80 for template in "${arrTemplates[@]}"
81 do
82 [ ! -z $template ] && {
83 input="$input _FILE_SEPERATOR_ $(cat $template)"
84 }
85 done
86
87 # we always want our config file last so it takes priority
88 input="$input _FILE_SEPERATOR_ $config_data"
89
90 set_volumes
91
92 rm -f $cidbootstrap
93
94 (exec echo "$input" | docker run -e DOCKER_HOST_IP=$docker_ip -cidfile $cidbootstrap -i -a stdin -a stdout -a stderr $volumes $image \
95 /bin/bash -c 'cd /pups && git pull && /pups/bin/pups --stdin') \
96 || (docker rm `cat $cidbootstrap` && rm $cidbootstrap)
97
98 [ ! -e $cidbootstrap ] && echo "FAILED TO BOOTSTRAP" && exit 1
99
100 sleep 5
101
102 docker commit `cat $cidbootstrap` $local_discourse/$config || echo 'FAILED TO COMMIT'
103 docker rm `cat $cidbootstrap` && rm $cidbootstrap
104
105 echo "Successfully bootstrappd, to starup use ./launcher start $config"
106 exit 0
107 ;;
108
109 ssh)
110 if [ ! -e $cidfile ]
111 then
112 echo "No cid found"
113 exit 1
114 else
115 cid="`cat $cidfile`"
116 address="`docker port $cid 22`"
117 split=(${address//:/ })
118 exec ssh root@${split[0]} -p ${split[1]}
119 fi
120 ;;
121
122 stop)
123 if [ ! -e $cidfile ]
124 then
125 echo "No cid found"
126 exit 1
127 else
128 docker stop -t 10 `cat $cidfile`
129 exit 0
130 fi
131 ;;
132
133 logs)
134
135 if [ ! -e $cidfile ]
136 then
137 echo "No cid found"
138 exit 1
139 else
140 docker logs `cat $cidfile`
141 exit 0
142 fi
143 ;;
144
145 start)
146
147 if [ ! -e $cidfile ]
148 then
149 echo "No cid found, creating a new container"
150 ports=`cat $config_file | docker run -rm -i -a stdout -a stdin $image ruby -e \
151 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| '-p ' << p.to_s << ' '}.join"`
152
153 set_volumes
154
155 docker run -e DOCKER_HOST_IP=$docker_ip -name $config -cidfile $cidfile $ports \
156 -d $volumes $local_discourse/$config /usr/bin/runsvdir -P /etc/service
157
158 exit 0
159 else
160 echo "cid found, ensuring container is started"
161 docker start `cat $cidfile`
162 exit 0
163 fi
164 ;;
165
166
167 destroy)
168 if [ -e $cidfile ]
169 then
170 echo "destroying container $cidfile"
171 docker stop -t 10 `cat $cidfile`
172 docker rm `cat $cidfile` && rm $cidfile
173 exit 0
174 else
175 echo "nothing to destroy cidfile does not exist"
176 exit 1
177 fi
178 ;;
179 esac
180
181 usage