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