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"
149 (exec echo "$input" | docker run
"${env[@]}" -e DOCKER_HOST_IP
=$docker_ip --cidfile $cidbootstrap -i -a stdin
-a stdout
-a stderr
$volumes $image \
150 /bin
/bash
-c "$run_command") \
151 ||
(docker
rm `cat $cidbootstrap` && rm $cidbootstrap)
153 [ ! -e $cidbootstrap ] && echo "FAILED TO BOOTSTRAP" && exit 1
157 docker commit
`cat $cidbootstrap` $local_discourse/$config ||
echo 'FAILED TO COMMIT'
158 docker
rm `cat $cidbootstrap` && rm $cidbootstrap
160 echo "Successfully bootstrapped, to startup use ./launcher start $config"
171 address
="`docker port $cid 22`"
172 split=(${address//:/ })
173 exec ssh -o StrictHostKeyChecking
=no root@
${split[0]} -p ${split[1]}
183 docker stop
-t 10 `cat $cidfile`
195 docker logs
`cat $cidfile`
204 echo "No cid found, creating a new container"
205 ports
=`cat $config_file | docker run --rm -i -a stdout -a stdin $image ruby -e \
206 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| '-p ' << p.to_s << ' '}.join"`
211 existing
=`docker ps -a | awk '{ print $1, $(NF) }' | grep "$config$" | awk '{ print $1 }'`
212 if [ ! -z $existing ]
214 echo "Found an existing container by its name, recovering cidfile, please rerun"
215 echo $existing > $cidfile
219 docker run
"${env[@]}" -h "`hostname`-$config" -e DOCKER_HOST_IP
=$docker_ip -name $config --cidfile $cidfile $ports \
220 -d $volumes $local_discourse/$config /usr
/bin
/runsvdir
-P /etc
/service
228 echo "Detected empty cid file, deleting, please re-run"
233 found
=`docker ps -q -a -notrunc | grep $cid`
236 echo "Invalid cid file, deleting, please re-run"
241 echo "cid found, ensuring container is started"
242 docker start
`cat $cidfile`
251 echo "destroying container $cidfile"
252 docker stop
-t 10 `cat $cidfile`
253 docker
rm `cat $cidfile` && rm $cidfile
256 echo "nothing to destroy cidfile does not exist"