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
:0.1.2
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 # 1. docker daemon running?
35 test=`docker info >/dev/null`
37 if [[ $?
-ne 0 ]] ; then
38 echo "Cannot connect to the docker daemon - verify it is running and you have access"
43 test=`docker info 2> /dev/null | grep 'Driver: aufs'`
44 if [[ "$test" =~
"aufs" ]] ; then : ; else
45 echo "Your Docker installation is not using aufs"
46 echo "Device mapper and other experimental drivers are unstable"
48 echo "Please ensure your kernel is running linux extras and aufs"
49 echo "Please follow the installation guide for Docker here: http://docs.docker.io/en/latest/installation/ubuntulinux/"
53 # 3. running docker 0.9+
54 test=`docker --version | grep 0.9`
56 if [[ "$test" =~
"0.9" ]] ; then : ; else
57 echo "Your Docker installation is old, please upgrade to 0.9.0 or up"
61 # 4. able to attach stderr / out / tty
62 test=`docker run -i --rm -a stdin -a stdout -a stderr $image echo working`
63 if [[ "$test" =~
"working" ]] ; then : ; else
64 echo "Your Docker installation is not working correctly"
66 echo "See: https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam"
75 if [[ ! -e ~
/.ssh
/id_rsa.pub
&& ! -e ~
/.ssh
/id_dsa.pub
]] ; then
76 echo You have no SSH key associated to this profile
77 echo "(This will allow you ssh access into your container)"
78 read -p "Generate SSH key at ~/.ssh/id_rsa.pub? (y/N) " -n 1 -r
79 if [[ $REPLY =~ ^
[Yy
]$
]] ; then
81 echo Generating SSH key
82 mkdir
-p ~
/.
ssh && ssh-keygen
-f ~
/.ssh
/id_rsa
-t rsa
-N ''
85 echo WARNING
: You may not be able to log
in to your container.
91 ssh_pub_key
="$(cat ~/.ssh/id_rsa.pub 2>/dev/null || cat ~/.ssh/id_dsa.pub)"
97 echo "Docker is not installed, make sure you are running on the 3.8 kernel"
98 echo "The best supported Docker release is Ubuntu 12.04.03 for it run the following"
100 echo "sudo apt-get update"
101 echo "sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring"
105 echo "sudo sh -c \"wget -qO- https://get.docker.io/gpg | apt-key add -\""
106 echo "sudo sh -c \"echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list\""
107 echo "sudo apt-get update"
108 echo "sudo apt-get install lxc-docker"
114 volumes
=`cat $config_file | docker run --rm -i -a stdout -a stdin $image ruby -e \
115 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
118 set_template_info
() {
120 templates
=`cat $config_file | docker run --rm -i -a stdin -a stdout $image ruby -e \
121 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
124 arrTemplates
=(${templates// / })
125 config_data
=$
(cat $config_file)
130 for template
in "${arrTemplates[@]}"
132 [ ! -z $template ] && {
133 input
="$input _FILE_SEPERATOR_ $(cat $template)"
137 # we always want our config file last so it takes priority
138 input
="$input _FILE_SEPERATOR_ $config_data"
140 read -r -d '' env_ruby
<< 'RUBY'
143 input
=STDIN.readlines.
join
145 input.
split('_FILE_SEPERATOR_').each
do |yml|
148 env.merge
!(YAML.load
(yml
)['env'] ||
{})
154 puts env.map
{|k
,v|
"-e\n#{k}=#{v}" }.
join("\n")
157 raw
=`exec echo "$input" | docker run --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
164 echo "Calculated ENV: ${env[@]}"
167 [ -z $docker_path ] && {
176 if [ ! -e $config_file ]
178 echo "Config file was not found, ensure $config_file exists"
189 docker stop
-t 10 `cat $cidfile`
197 echo "No cid found, creating a new container"
198 ports
=`cat $config_file | docker run --rm -i -a stdout -a stdin $image ruby -e \
199 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| '-p ' << p.to_s << ' '}.join"`
204 existing
=`docker ps -a | awk '{ print $1, $(NF) }' | grep "$config$" | awk '{ print $1 }'`
205 if [ ! -z $existing ]
207 echo "Found an existing container by its name, recovering cidfile, please rerun"
208 echo $existing > $cidfile
212 docker run
"${env[@]}" -h "`hostname`-$config" -e DOCKER_HOST_IP
=$docker_ip --name $config -t --cidfile $cidfile $ports \
213 -d $volumes $local_discourse/$config /usr
/bin
/runsvdir
-P /etc
/service
221 echo "Detected empty cid file, deleting, please re-run"
226 found
=`docker ps -q -a --no-trunc | grep $cid`
229 echo "Invalid cid file, deleting, please re-run"
234 echo "cid found, ensuring container is started"
235 docker start
`cat $cidfile`
246 # Is the image available?
247 # If not, pull it here so the user is aware what's happening.
248 docker
history $image >/dev
/null
2>&1 || docker pull
$image
252 base_image
=`cat $config_file | docker run --rm -i -a stdin -a stdout $image ruby -e \
253 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
255 update_pups
=`cat $config_file | docker run --rm -i -a stdin -a stdout $image ruby -e \
256 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
258 if [[ ! X
"" = X
"$base_image" ]]; then
266 run_command
="cd /pups &&"
267 if [[ ! "false" = $update_pups ]]; then
268 run_command
="$run_command git pull &&"
270 run_command
="$run_command /pups/bin/pups --stdin"
274 env
=("${env[@]}" "-e" "SSH_PUB_KEY=$ssh_pub_key")
276 (exec echo "$input" | docker run
"${env[@]}" -e DOCKER_HOST_IP
=$docker_ip --cidfile $cidbootstrap -i -a stdin
-a stdout
-a stderr
$volumes $image \
277 /bin
/bash
-c "$run_command") \
278 ||
(docker
rm `cat $cidbootstrap` && rm $cidbootstrap)
280 [ ! -e $cidbootstrap ] && echo "FAILED TO BOOTSTRAP" && exit 1
284 docker commit
`cat $cidbootstrap` $local_discourse/$config ||
echo 'FAILED TO COMMIT'
285 docker
rm `cat $cidbootstrap` && rm $cidbootstrap
287 echo "Successfully bootstrapped, to startup use ./launcher start $config"
298 address
="`docker port $cid 22`"
299 split=(${address//:/ })
300 exec ssh -o StrictHostKeyChecking
=no root@
${split[0]} -p ${split[1]}
316 docker logs
`cat $cidfile`
336 echo "destroying container $cidfile"
337 docker stop
-t 10 `cat $cidfile`
338 docker
rm `cat $cidfile` && rm $cidfile
341 echo "nothing to destroy cidfile does not exist"