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"
35 test=`docker info 2> /dev/null | grep 'Driver: aufs'`
36 if [[ "$test" =~
"aufs" ]] ; then : ; else
37 echo "Your Docker installation is not using aufs"
38 echo "Device mapper and other experimental drivers are unstable"
40 echo "Please ensure your kernel is running linux extras and aufs"
41 echo "Please follow the installation guide for Docker here: http://docs.docker.io/en/latest/installation/ubuntulinux/"
45 # 2. running docker 0.9+
46 test=`docker --version | grep 0.9`
48 if [[ "$test" =~
"0.9" ]] ; then : ; else
49 echo "Your Docker installation is old, please upgrade to 0.9.0 or up"
53 # 3. able to attach stderr / out / tty
54 test=`docker run -i --rm -a stdin -a stdout -a stderr $image echo working`
55 if [[ "$test" =~
"working" ]] ; then : ; else
56 echo "Your Docker installation is not working correctly"
58 echo "See: https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam"
68 if [[ ! -e ~
/.ssh
/id_rsa.pub
]] ; then
69 echo You have no SSH key associated to this profile
70 echo "(This will allow you ssh access into your container)"
71 read -p "Generate SSH key at ~/.ssh/id_rsa.pub? (y/N) " -n 1 -r
72 if [[ $REPLY =~ ^
[Yy
]$
]]
75 echo Generating SSH key
76 (mkdir
-p ~
/.
ssh && cd ~
/.
ssh && ssh-keygen
-f id_rsa
-t rsa
-N '')
79 echo WARNING
: You may not be able to log
in to your container.
85 ssh_pub_key
=`cat ~/.ssh/id_rsa.pub`
91 echo "Docker is not installed, make sure you are running on the 3.8 kernel"
92 echo "The best supported Docker release is Ubuntu 12.04.03 for it run the following"
94 echo "sudo apt-get update"
95 echo "sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring"
99 echo "sudo sh -c \"wget -qO- https://get.docker.io/gpg | apt-key add -\""
100 echo "sudo sh -c \"echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list\""
101 echo "sudo apt-get update"
102 echo "sudo apt-get install lxc-docker"
108 volumes
=`cat $config_file | docker run --rm -i -a stdout -a stdin $image ruby -e \
109 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
112 set_template_info
() {
114 templates
=`cat $config_file | docker run --rm -i -a stdin -a stdout $image ruby -e \
115 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
118 arrTemplates
=(${templates// / })
119 config_data
=$
(cat $config_file)
124 for template
in "${arrTemplates[@]}"
126 [ ! -z $template ] && {
127 input
="$input _FILE_SEPERATOR_ $(cat $template)"
131 # we always want our config file last so it takes priority
132 input
="$input _FILE_SEPERATOR_ $config_data"
134 read -r -d '' env_ruby
<< 'RUBY'
137 input
=STDIN.readlines.
join
139 input.
split('_FILE_SEPERATOR_').each
do |yml|
142 env.merge
!(YAML.load
(yml
)['env'] ||
{})
148 puts env.map
{|k
,v|
"-e\n#{k}=#{v}" }.
join("\n")
151 raw
=`exec echo "$input" | docker run --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
158 echo "Calculated ENV: ${env[@]}"
161 [ -z $docker_path ] && {
170 if [ ! -e $config_file ]
172 echo "Config file was not found, ensure $config_file exists"
183 docker stop
-t 10 `cat $cidfile`
191 echo "No cid found, creating a new container"
192 ports
=`cat $config_file | docker run --rm -i -a stdout -a stdin $image ruby -e \
193 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| '-p ' << p.to_s << ' '}.join"`
198 existing
=`docker ps -a | awk '{ print $1, $(NF) }' | grep "$config$" | awk '{ print $1 }'`
199 if [ ! -z $existing ]
201 echo "Found an existing container by its name, recovering cidfile, please rerun"
202 echo $existing > $cidfile
206 docker run
"${env[@]}" -h "`hostname`-$config" -e DOCKER_HOST_IP
=$docker_ip --name $config -t --cidfile $cidfile $ports \
207 -d $volumes $local_discourse/$config /usr
/bin
/runsvdir
-P /etc
/service
215 echo "Detected empty cid file, deleting, please re-run"
220 found
=`docker ps -q -a --no-trunc | grep $cid`
223 echo "Invalid cid file, deleting, please re-run"
228 echo "cid found, ensuring container is started"
229 docker start
`cat $cidfile`
240 # Is the image available?
241 # If not, pull it here so the user is aware what's happening.
242 docker
history $image >/dev
/null
2>&1 || docker pull
$image
246 base_image
=`cat $config_file | docker run --rm -i -a stdin -a stdout $image ruby -e \
247 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
249 update_pups
=`cat $config_file | docker run --rm -i -a stdin -a stdout $image ruby -e \
250 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
252 if [[ ! X
"" = X
"$base_image" ]]; then
260 run_command
="cd /pups &&"
261 if [[ ! "false" = $update_pups ]]; then
262 run_command
="$run_command git pull &&"
264 run_command
="$run_command /pups/bin/pups --stdin"
268 env
=("${env[@]}" "-e" "SSH_PUB_KEY=\"$ssh_pub_key\"")
270 (exec echo "$input" | docker run
"${env[@]}" -e DOCKER_HOST_IP
=$docker_ip --cidfile $cidbootstrap -i -a stdin
-a stdout
-a stderr
$volumes $image \
271 /bin
/bash
-c "$run_command") \
272 ||
(docker
rm `cat $cidbootstrap` && rm $cidbootstrap)
274 [ ! -e $cidbootstrap ] && echo "FAILED TO BOOTSTRAP" && exit 1
278 docker commit
`cat $cidbootstrap` $local_discourse/$config ||
echo 'FAILED TO COMMIT'
279 docker
rm `cat $cidbootstrap` && rm $cidbootstrap
281 echo "Successfully bootstrapped, to startup use ./launcher start $config"
292 address
="`docker port $cid 22`"
293 split=(${address//:/ })
294 exec ssh -o StrictHostKeyChecking
=no root@
${split[0]} -p ${split[1]}
310 docker logs
`cat $cidfile`
330 echo "destroying container $cidfile"
331 docker stop
-t 10 `cat $cidfile`
332 docker
rm `cat $cidfile` && rm $cidfile
335 echo "nothing to destroy cidfile does not exist"