8 config_file
=containers
/"$config".yml
9 cidfile
=cids
/"$config".cid
10 cidbootstrap
=cids
/"$config"_boostrap.cid
11 local_discourse
=local_discourse
12 image
=samsaffron
/discourse
:0.2.0
13 docker_path
=`which docker`
15 docker_ip
=`/sbin/ifconfig | \
16 grep -B1 "inet addr" | \
17 awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' | \
19 awk -F: '{ print $3 }';`
23 echo "Usage: launcher COMMAND CONFIG [--skip-prereqs]"
25 echo " start: Start/initialize a container"
26 echo " stop: Stop a running container"
27 echo " restart: Restart a container"
28 echo " destroy: Stop and remove a container"
29 echo " ssh: Start a bash shell in a running container"
30 echo " logs: Docker logs for container"
31 echo " bootstrap: Bootstrap a container for the config based on a template"
32 echo " rebuild: Rebuild a container (destroy old, bootstrap, start new)"
35 echo " --skip-prereqs Don't check prerequisites"
41 # 1. docker daemon running?
42 test=`docker info >/dev/null`
44 if [[ $?
-ne 0 ]] ; then
45 echo "Cannot connect to the docker daemon - verify it is running and you have access"
50 test=`docker info 2> /dev/null | grep 'Driver: aufs'`
51 if [[ "$test" =~
"aufs" ]] ; then : ; else
52 echo "Your Docker installation is not using aufs"
53 echo "Device mapper and other experimental drivers are unstable"
55 echo "Please ensure your kernel is running linux extras and aufs"
56 echo "Please follow the installation guide for Docker here: http://docs.docker.io/en/latest/installation/ubuntulinux/"
60 # 3. running docker 0.10+
61 test=`docker --version | grep 0.10`
63 if [[ "$test" =~
"0.10" ]] ; then : ; else
64 echo "Your Docker installation is old, please upgrade to 0.10.0 or up"
68 # 4. able to attach stderr / out / tty
69 test=`docker run -i --rm -a stdout -a stderr $image echo working`
70 if [[ "$test" =~
"working" ]] ; then : ; else
71 echo "Your Docker installation is not working correctly"
73 echo "See: https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam"
78 if [ "$opt" != "--skip-prereqs" ] ; then
84 if [[ ! -e ~
/.ssh
/id_rsa.pub
&& ! -e ~
/.ssh
/id_dsa.pub
]] ; then
85 echo You have no SSH key associated to this profile
86 echo "(This will allow you ssh access into your container)"
87 read -p "Generate SSH key at ~/.ssh/id_rsa.pub? (y/N) " -n 1 -r
88 if [[ $REPLY =~ ^
[Yy
]$
]] ; then
90 echo Generating SSH key
91 mkdir
-p ~
/.
ssh && ssh-keygen
-f ~
/.ssh
/id_rsa
-t rsa
-N ''
94 echo WARNING
: You may not be able to log
in to your container.
100 ssh_pub_key
="$(cat ~/.ssh/id_rsa.pub 2>/dev/null || cat ~/.ssh/id_dsa.pub)"
106 echo "Docker is not installed, make sure you are running on the 3.8 kernel"
107 echo "The best supported Docker release is Ubuntu 12.04.03 for it run the following"
109 echo "sudo apt-get update"
110 echo "sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring"
114 echo "sudo sh -c \"wget -qO- https://get.docker.io/gpg | apt-key add -\""
115 echo "sudo sh -c \"echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list\""
116 echo "sudo apt-get update"
117 echo "sudo apt-get install lxc-docker"
123 volumes
=`cat $config_file | docker run --rm -i -a stdout -a stdin $image ruby -e \
124 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
127 set_template_info
() {
129 templates
=`cat $config_file | docker run --rm -i -a stdin -a stdout $image ruby -e \
130 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
133 arrTemplates
=(${templates// / })
134 config_data
=$
(cat $config_file)
139 for template
in "${arrTemplates[@]}"
141 [ ! -z $template ] && {
142 input
="$input _FILE_SEPERATOR_ $(cat $template)"
146 # we always want our config file last so it takes priority
147 input
="$input _FILE_SEPERATOR_ $config_data"
149 read -r -d '' env_ruby
<< 'RUBY'
152 input
=STDIN.readlines.
join
154 input.
split('_FILE_SEPERATOR_').each
do |yml|
157 env.merge
!(YAML.load
(yml
)['env'] ||
{})
163 puts env.map
{|k
,v|
"-e\n#{k}=#{v}" }.
join("\n")
166 raw
=`exec echo "$input" | docker run --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
173 echo "Calculated ENV: ${env[@]}"
176 [ -z $docker_path ] && {
185 if [ ! -e $config_file ]
187 echo "Config file was not found, ensure $config_file exists"
198 docker stop
-t 10 `cat $cidfile`
206 echo "No cid found, creating a new container"
207 ports
=`cat $config_file | docker run --rm -i -a stdout -a stdin $image ruby -e \
208 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| '-p ' << p.to_s << ' '}.join"`
213 existing
=`docker ps -a | awk '{ print $1, $(NF) }' | grep "$config$" | awk '{ print $1 }'`
214 if [ ! -z $existing ]
216 echo "Found an existing container by its name, recovering cidfile, please rerun"
217 echo $existing > $cidfile
221 docker run
"${env[@]}" -h "`hostname`-$config" -e DOCKER_HOST_IP
=$docker_ip --name $config -t --cidfile $cidfile $ports \
222 -d $volumes $local_discourse/$config /usr
/bin
/runsvdir
-P /etc
/service
230 echo "Detected empty cid file, deleting, please re-run"
235 found
=`docker ps -q -a --no-trunc | grep $cid`
238 echo "Invalid cid file, deleting, please re-run"
243 echo "cid found, ensuring container is started"
244 docker start
`cat $cidfile`
253 # Is the image available?
254 # If not, pull it here so the user is aware what's happening.
255 docker
history $image >/dev
/null
2>&1 || docker pull
$image
259 base_image
=`cat $config_file | docker run --rm -i -a stdin -a stdout $image ruby -e \
260 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
262 update_pups
=`cat $config_file | docker run --rm -i -a stdin -a stdout $image ruby -e \
263 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
265 if [[ ! X
"" = X
"$base_image" ]]; then
273 run_command
="cd /pups &&"
274 if [[ ! "false" = $update_pups ]]; then
275 run_command
="$run_command git pull &&"
277 run_command
="$run_command /pups/bin/pups --stdin"
281 env
=("${env[@]}" "-e" "SSH_PUB_KEY=$ssh_pub_key")
283 (exec echo "$input" | docker run
"${env[@]}" -e DOCKER_HOST_IP
=$docker_ip --cidfile $cidbootstrap -i -a stdin
-a stdout
-a stderr
$volumes $image \
284 /bin
/bash
-c "$run_command") \
285 ||
(docker
rm `cat $cidbootstrap` && rm $cidbootstrap)
287 [ ! -e $cidbootstrap ] && echo "FAILED TO BOOTSTRAP" && exit 1
291 docker commit
`cat $cidbootstrap` $local_discourse/$config ||
echo 'FAILED TO COMMIT'
292 docker
rm `cat $cidbootstrap` && rm $cidbootstrap
299 echo "Successfully bootstrapped, to startup use ./launcher start $config"
310 address
="`docker port $cid 22`"
311 split=(${address//:/ })
312 exec ssh -o StrictHostKeyChecking
=no root@
${split[0]} -p ${split[1]}
328 docker logs
`cat $cidfile`
347 echo "Stopping old container"
348 docker stop
-t 10 `cat $cidfile`
355 docker
rm `cat $cidfile` && rm $cidfile
366 echo "destroying container $cidfile"
367 docker stop
-t 10 `cat $cidfile`
368 docker
rm `cat $cidfile` && rm $cidfile
371 echo "nothing to destroy cidfile does not exist"