urgency
[discourse_docker.git] / launcher
CommitLineData
ace450bd 1#!/bin/bash
7e738616
S
2
3command=$1
4config=$2
8dea575c 5config_file=containers/"$config".yml
7e738616 6cidfile=cids/"$config".cid
1acce9e4 7cidbootstrap=cids/"$config"_boostrap.cid
5efded6a 8local_discourse=local_discourse
52388b87
SS
9image=samsaffron/discourse
10docker_path=`which docker`
7e738616 11
80c11be3
SS
12docker_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
5f803fb4 19usage () {
7e738616
S
20 echo "Usage: launcher COMMAND CONFIG"
21 echo "Commands:"
1acce9e4
SS
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"
5f803fb4 26 echo " ssh: Start a bash shell in a running container"
1acce9e4 27 echo " logs: Docker logs for container"
408a9c19 28 echo " bootstrap: Bootstrap a container for the config based on a template"
7e738616
S
29 exit 1
30}
31
52388b87
SS
32install_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
d90671f3 50set_volumes() {
b86ac1af 51 volumes=`cat $config_file | docker run -rm -i -a stdout -a stdin $image ruby -e \
d90671f3
SS
52 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
53}
54
7f77c274
SS
55set_template_info() {
56
57 templates=`cat $config_file | docker run -rm -i -a stdin -a stdout $image ruby -e \
58 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
59
60
61 arrTemplates=(${templates// / })
62 config_data=$(cat $config_file)
63
64 input="hack: true"
65
66
67 for template in "${arrTemplates[@]}"
68 do
69 [ ! -z $template ] && {
70 input="$input _FILE_SEPERATOR_ $(cat $template)"
71 }
72 done
73
74 # we always want our config file last so it takes priority
75 input="$input _FILE_SEPERATOR_ $config_data"
76
77 read -r -d '' env_ruby << 'RUBY'
78 require 'yaml'
79
80 input=STDIN.readlines.join
81 env = {}
82 input.split('_FILE_SEPERATOR_').each do |yml|
83 yml.strip!
84 begin
85 env.merge!(YAML.load(yml)['env'] || {})
86 rescue => e
87 puts yml
88 p e
89 end
90 end
4b563ee8 91 puts env.map{|k,v| "-e\n#{k}=#{v}" }.join("\n")
7f77c274
SS
92RUBY
93
4b563ee8
SS
94 raw=`exec echo "$input" | docker run -rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
95
96 env=()
97 while read i; do
98 env[${#env[@]}]=$i
99 done <<< "$raw"
100
101 echo "Calculated ENV: ${env[@]}"
7f77c274
SS
102}
103
52388b87
SS
104[ -z $docker_path ] && {
105 install_docker
106}
107
5f803fb4
SS
108
109[ $# -ne 2 ] && {
110 usage
111}
112
7e738616
S
113if [ ! -e $config_file ]
114 then
115 echo "Config file was not found, ensure $config_file exists"
116 exit 1
117fi
118
5f803fb4
SS
119case "$command" in
120 bootstrap)
93149421 121
7f77c274 122 set_template_info
93149421 123
b9c7b50e
SS
124 base_image=`cat $config_file | docker run -rm -i -a stdin -a stdout $image ruby -e \
125 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
126
127 update_pups=`cat $config_file | docker run -rm -i -a stdin -a stdout $image ruby -e \
128 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
129
b9c7b50e
SS
130 if [[ ! X"" = X"$base_image" ]]; then
131 image=$base_image
132 fi
133
d90671f3
SS
134 set_volumes
135
2162f1d4
SS
136 rm -f $cidbootstrap
137
b9c7b50e
SS
138 run_command="cd /pups &&"
139 if [[ ! "false" = $update_pups ]]; then
140 run_command="$run_command git pull &&"
141 fi
142 run_command="$run_command /pups/bin/pups --stdin"
143
4b563ee8 144 (exec echo "$input" | docker run "${env[@]}" -e DOCKER_HOST_IP=$docker_ip -cidfile $cidbootstrap -i -a stdin -a stdout -a stderr $volumes $image \
b9c7b50e 145 /bin/bash -c "$run_command") \
2162f1d4 146 || (docker rm `cat $cidbootstrap` && rm $cidbootstrap)
9fb5f2d3 147
2162f1d4
SS
148 [ ! -e $cidbootstrap ] && echo "FAILED TO BOOTSTRAP" && exit 1
149
150 sleep 5
9fb5f2d3 151
5efded6a 152 docker commit `cat $cidbootstrap` $local_discourse/$config || echo 'FAILED TO COMMIT'
4b3aebe1 153 docker rm `cat $cidbootstrap` && rm $cidbootstrap
2162f1d4 154
2dd2e330 155 echo "Successfully bootstrapped, to startup use ./launcher start $config"
4b3aebe1 156 exit 0
5f803fb4 157 ;;
1acce9e4 158
5f803fb4
SS
159 ssh)
160 if [ ! -e $cidfile ]
161 then
162 echo "No cid found"
163 exit 1
164 else
165 cid="`cat $cidfile`"
166 address="`docker port $cid 22`"
167 split=(${address//:/ })
168 exec ssh root@${split[0]} -p ${split[1]}
169 fi
170 ;;
7e738616 171
5f803fb4
SS
172 stop)
173 if [ ! -e $cidfile ]
174 then
175 echo "No cid found"
176 exit 1
177 else
178 docker stop -t 10 `cat $cidfile`
179 exit 0
180 fi
181 ;;
7e738616 182
5f803fb4 183 logs)
7e738616 184
5f803fb4
SS
185 if [ ! -e $cidfile ]
186 then
187 echo "No cid found"
188 exit 1
189 else
190 docker logs `cat $cidfile`
191 exit 0
192 fi
193 ;;
7e738616 194
5f803fb4 195 start)
7e738616 196
5f803fb4
SS
197 if [ ! -e $cidfile ]
198 then
199 echo "No cid found, creating a new container"
b86ac1af 200 ports=`cat $config_file | docker run -rm -i -a stdout -a stdin $image ruby -e \
36941588 201 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| '-p ' << p.to_s << ' '}.join"`
d90671f3 202
7f77c274 203 set_template_info
d90671f3
SS
204 set_volumes
205
2aa2732e 206 existing=`docker ps -a | awk '{ print $1, $(NF) }' | grep "$config$" | awk '{ print $1 }'`
90506274
SS
207 if [ ! -z $existing ]
208 then
209 echo "Found an existing container by its name, recovering cidfile, please rerun"
210 echo $existing > $cidfile
211 exit 1
212 fi
213
4b563ee8 214 docker run "${env[@]}" -e DOCKER_HOST_IP=$docker_ip -name $config -cidfile $cidfile $ports \
80c11be3
SS
215 -d $volumes $local_discourse/$config /usr/bin/runsvdir -P /etc/service
216
5f803fb4
SS
217 exit 0
218 else
90506274
SS
219 cid=`cat $cidfile`
220
221 if [ -z $cid ]
222 then
223 echo "Detected empty cid file, deleting, please re-run"
224 rm $cidfile
225 exit 1
226 fi
227
74a4fe61 228 found=`docker ps -q -a -notrunc | grep $cid`
90506274
SS
229 if [ -z $found ]
230 then
231 echo "Invalid cid file, deleting, please re-run"
232 rm $cidfile
233 exit 1
234 fi
235
5f803fb4
SS
236 echo "cid found, ensuring container is started"
237 docker start `cat $cidfile`
238 exit 0
239 fi
240 ;;
7e738616 241
7e738616 242
5f803fb4
SS
243 destroy)
244 if [ -e $cidfile ]
245 then
246 echo "destroying container $cidfile"
247 docker stop -t 10 `cat $cidfile`
248 docker rm `cat $cidfile` && rm $cidfile
249 exit 0
250 else
251 echo "nothing to destroy cidfile does not exist"
252 exit 1
253 fi
254 ;;
255esac
7e738616 256
5f803fb4 257usage