35de3a89b4fd65d5a121eac600451111128c5ca7
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 #{k}=#{v}" }.
join(" ")
94 env
=`exec echo "$input" | docker run -rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
95 echo "Calculated ENV: $env"
98 [ -z $docker_path ] && {
107 if [ ! -e $config_file ]
109 echo "Config file was not found, ensure $config_file exists"
118 base_image
=`cat $config_file | docker run -rm -i -a stdin -a stdout $image ruby -e \
119 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
121 update_pups
=`cat $config_file | docker run -rm -i -a stdin -a stdout $image ruby -e \
122 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
124 if [[ ! X
"" = X
"$base_image" ]]; then
132 run_command
="cd /pups &&"
133 if [[ ! "false" = $update_pups ]]; then
134 run_command
="$run_command git pull &&"
136 run_command
="$run_command /pups/bin/pups --stdin"
138 (exec echo "$input" | docker run
$env -e DOCKER_HOST_IP
=$docker_ip -cidfile $cidbootstrap -i -a stdin
-a stdout
-a stderr
$volumes $image \
139 /bin
/bash
-c "$run_command") \
140 ||
(docker
rm `cat $cidbootstrap` && rm $cidbootstrap)
142 [ ! -e $cidbootstrap ] && echo "FAILED TO BOOTSTRAP" && exit 1
146 docker commit
`cat $cidbootstrap` $local_discourse/$config ||
echo 'FAILED TO COMMIT'
147 docker
rm `cat $cidbootstrap` && rm $cidbootstrap
149 echo "Successfully bootstrapped, to startup use ./launcher start $config"
160 address
="`docker port $cid 22`"
161 split=(${address//:/ })
162 exec ssh root@
${split[0]} -p ${split[1]}
172 docker stop
-t 10 `cat $cidfile`
184 docker logs
`cat $cidfile`
193 echo "No cid found, creating a new container"
194 ports
=`cat $config_file | docker run -rm -i -a stdout -a stdin $image ruby -e \
195 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| '-p ' << p.to_s << ' '}.join"`
200 existing
=`docker ps -a | awk '{ print $1, $(NF) }' | grep $config | awk '{ print $1 }'`
201 if [ ! -z $existing ]
203 echo "Found an existing container by its name, recovering cidfile, please rerun"
204 echo $existing > $cidfile
208 docker run
$env -e DOCKER_HOST_IP
=$docker_ip -name $config -cidfile $cidfile $ports \
209 -d $volumes $local_discourse/$config /usr
/bin
/runsvdir
-P /etc
/service
217 echo "Detected empty cid file, deleting, please re-run"
222 found
=`docker ps -q -a | grep $cid`
225 echo "Invalid cid file, deleting, please re-run"
230 echo "cid found, ensuring container is started"
231 docker start
`cat $cidfile`
240 echo "destroying container $cidfile"
241 docker stop
-t 10 `cat $cidfile`
242 docker
rm `cat $cidfile` && rm $cidfile
245 echo "nothing to destroy cidfile does not exist"