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