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"
121 # Is the image available?
122 # If not, pull it here so the user is aware what's happening.
123 docker
history $image >/dev
/null
2>&1 || docker pull
$image
127 base_image
=`cat $config_file | docker run -rm -i -a stdin -a stdout $image ruby -e \
128 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
130 update_pups
=`cat $config_file | docker run -rm -i -a stdin -a stdout $image ruby -e \
131 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
133 if [[ ! X
"" = X
"$base_image" ]]; then
141 run_command
="cd /pups &&"
142 if [[ ! "false" = $update_pups ]]; then
143 run_command
="$run_command git pull &&"
145 run_command
="$run_command /pups/bin/pups --stdin"
147 (exec echo "$input" | docker run
"${env[@]}" -e DOCKER_HOST_IP
=$docker_ip -cidfile $cidbootstrap -i -a stdin
-a stdout
-a stderr
$volumes $image \
148 /bin
/bash
-c "$run_command") \
149 ||
(docker
rm `cat $cidbootstrap` && rm $cidbootstrap)
151 [ ! -e $cidbootstrap ] && echo "FAILED TO BOOTSTRAP" && exit 1
155 docker commit
`cat $cidbootstrap` $local_discourse/$config ||
echo 'FAILED TO COMMIT'
156 docker
rm `cat $cidbootstrap` && rm $cidbootstrap
158 echo "Successfully bootstrapped, to startup use ./launcher start $config"
169 address
="`docker port $cid 22`"
170 split=(${address//:/ })
171 exec ssh -o StrictHostKeyChecking
=no root@
${split[0]} -p ${split[1]}
181 docker stop
-t 10 `cat $cidfile`
193 docker logs
`cat $cidfile`
202 echo "No cid found, creating a new container"
203 ports
=`cat $config_file | docker run -rm -i -a stdout -a stdin $image ruby -e \
204 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| '-p ' << p.to_s << ' '}.join"`
209 existing
=`docker ps -a | awk '{ print $1, $(NF) }' | grep "$config$" | awk '{ print $1 }'`
210 if [ ! -z $existing ]
212 echo "Found an existing container by its name, recovering cidfile, please rerun"
213 echo $existing > $cidfile
217 docker run
"${env[@]}" -h "`hostname`-$config" -e DOCKER_HOST_IP
=$docker_ip -name $config -cidfile $cidfile $ports \
218 -d $volumes $local_discourse/$config /usr
/bin
/runsvdir
-P /etc
/service
226 echo "Detected empty cid file, deleting, please re-run"
231 found
=`docker ps -q -a -notrunc | grep $cid`
234 echo "Invalid cid file, deleting, please re-run"
239 echo "cid found, ensuring container is started"
240 docker start
`cat $cidfile`
249 echo "destroying container $cidfile"
250 docker stop
-t 10 `cat $cidfile`
251 docker
rm `cat $cidfile` && rm $cidfile
254 echo "nothing to destroy cidfile does not exist"