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`
12 docker_ip
=`/sbin/ifconfig | \
13 grep -B1 "inet addr" | \
14 awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' | \
16 awk -F: '{ print $3 }';`
20 echo "Usage: launcher COMMAND CONFIG"
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"
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"
37 echo "sudo apt-get update"
38 echo "sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring"
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"
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"`
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']"`
61 arrTemplates
=(${templates// / })
62 config_data
=$
(cat $config_file)
67 for template
in "${arrTemplates[@]}"
69 [ ! -z $template ] && {
70 input
="$input _FILE_SEPERATOR_ $(cat $template)"
74 # we always want our config file last so it takes priority
75 input
="$input _FILE_SEPERATOR_ $config_data"
77 read -r -d '' env_ruby
<< 'RUBY'
80 input
=STDIN.readlines.
join
82 input.
split('_FILE_SEPERATOR_').each
do |yml|
85 env.merge
!(YAML.load
(yml
)['env'] ||
{})
91 puts env.map
{|k
,v|
"-e\n#{k}=#{v}" }.
join("\n")
94 raw
=`exec echo "$input" | docker run -rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
101 echo "Calculated ENV: ${env[@]}"
104 [ -z $docker_path ] && {
113 if [ ! -e $config_file ]
115 echo "Config file was not found, ensure $config_file exists"
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']"`
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']"`
130 if [[ ! X
"" = X
"$base_image" ]]; then
138 run_command
="cd /pups &&"
139 if [[ ! "false" = $update_pups ]]; then
140 run_command
="$run_command git pull &&"
142 run_command
="$run_command /pups/bin/pups --stdin"
144 (exec echo "$input" | docker run
"${env[@]}" -e DOCKER_HOST_IP
=$docker_ip -cidfile $cidbootstrap -i -a stdin
-a stdout
-a stderr
$volumes $image \
145 /bin
/bash
-c "$run_command") \
146 ||
(docker
rm `cat $cidbootstrap` && rm $cidbootstrap)
148 [ ! -e $cidbootstrap ] && echo "FAILED TO BOOTSTRAP" && exit 1
152 docker commit
`cat $cidbootstrap` $local_discourse/$config ||
echo 'FAILED TO COMMIT'
153 docker
rm `cat $cidbootstrap` && rm $cidbootstrap
155 echo "Successfully bootstrapped, to startup use ./launcher start $config"
166 address
="`docker port $cid 22`"
167 split=(${address//:/ })
168 exec ssh root@
${split[0]} -p ${split[1]}
178 docker stop
-t 10 `cat $cidfile`
190 docker logs
`cat $cidfile`
199 echo "No cid found, creating a new container"
200 ports
=`cat $config_file | docker run -rm -i -a stdout -a stdin $image ruby -e \
201 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| '-p ' << p.to_s << ' '}.join"`
206 existing
=`docker ps -a | awk '{ print $1, $(NF) }' | grep "$config$" | awk '{ print $1 }'`
207 if [ ! -z $existing ]
209 echo "Found an existing container by its name, recovering cidfile, please rerun"
210 echo $existing > $cidfile
214 docker run
"${env[@]}" -e DOCKER_HOST_IP
=$docker_ip -name $config -cidfile $cidfile $ports \
215 -d $volumes $local_discourse/$config /usr
/bin
/runsvdir
-P /etc
/service
223 echo "Detected empty cid file, deleting, please re-run"
228 found
=`docker ps -q -a -notrunc | grep $cid`
231 echo "Invalid cid file, deleting, please re-run"
236 echo "cid found, ensuring container is started"
237 docker start
`cat $cidfile`
246 echo "destroying container $cidfile"
247 docker stop
-t 10 `cat $cidfile`
248 docker
rm `cat $cidfile` && rm $cidfile
251 echo "nothing to destroy cidfile does not exist"