upgrade images
[discourse_docker.git] / launcher
CommitLineData
ace450bd 1#!/bin/bash
7e738616
S
2
3command=$1
4config=$2
55d17203
RW
5opt=$3
6
87756d6d
EH
7# Docker doesn't like uppercase characters, spaces or special characters, catch it now before we build everything out and then find out
8re='[A-Z/ !@#$%^&*()+~`=]'
9if [[ $config =~ $re ]];
10 then
11 echo
12 echo "ERROR: Config name must not contain upper case characters, spaces or special characters. Correct config name and rerun $0."
13 echo
14 exit 1
15fi
16
7936ebaa 17cd "$(dirname "$0")"
55d17203 18
5701c085
S
19docker_min_version='1.2.0'
20docker_rec_version='1.2.0'
60668406 21
8dea575c 22config_file=containers/"$config".yml
5201a40c 23cidbootstrap=cids/"$config"_bootstrap.cid
5efded6a 24local_discourse=local_discourse
2084bbe7 25image=samsaffron/discourse:1.0.13
4807b1b8 26docker_path=`which docker.io || which docker`
7e738616 27
e0fd1f5b
TB
28if [ "${SUPERVISED}" = "true" ]; then
29 restart_policy="--restart=no"
30 attach_on_start="-a"
31 attach_on_run="-a stdout -a stderr"
32else
33 attach_on_run="-d"
34fi
35
f2a3edee
AY
36if [ -n "$DOCKER_HOST" ]; then
37 docker_ip=`sed -e 's/^tcp:\/\/\(.*\):.*$/\1/' <<< "$DOCKER_HOST"`
38elif [ -x "$(which ip 2>/dev/null)" ]; then
813fef38 39 docker_ip=`ip addr show docker0 | \
03bb0735
LG
40 grep 'inet ' | \
41 awk '{ split($2,a,"/"); print a[1] }';`
42else
813fef38 43 docker_ip=`ifconfig | \
03bb0735
LG
44 grep -B1 "inet addr" | \
45 awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' | \
46 grep docker0 | \
47 awk -F: '{ print $3 }';`
48fi
80c11be3
SS
49
50
5f803fb4 51usage () {
55d17203 52 echo "Usage: launcher COMMAND CONFIG [--skip-prereqs]"
7e738616 53 echo "Commands:"
1acce9e4
SS
54 echo " start: Start/initialize a container"
55 echo " stop: Stop a running container"
56 echo " restart: Restart a container"
57 echo " destroy: Stop and remove a container"
2fc6ff36 58 echo " enter: Use nsenter to enter a container"
5f803fb4 59 echo " ssh: Start a bash shell in a running container"
1acce9e4 60 echo " logs: Docker logs for container"
408a9c19 61 echo " bootstrap: Bootstrap a container for the config based on a template"
680dd4ea 62 echo " rebuild: Rebuild a container (destroy old, bootstrap, start new)"
a8b66f98 63 echo " cleanup: Remove all containers that have stopped for > 24 hours"
55d17203
RW
64 echo
65 echo "Options:"
66 echo " --skip-prereqs Don't check prerequisites"
e02c1511 67 echo " --docker-args Extra arguments to pass when running docker"
7e738616
S
68 exit 1
69}
70
60668406
DP
71compare_version() {
72 declare -a ver_a
73 declare -a ver_b
74 IFS=. read -a ver_a <<< "$1"
75 IFS=. read -a ver_b <<< "$2"
76
77 while [[ -n $ver_a ]]; do
78 if (( ver_a > ver_b )); then
79 return 0
80 elif (( ver_b > ver_a )); then
81 return 1
82 else
83 unset ver_a[0]
84 ver_a=("${ver_a[@]}")
85 unset ver_b[0]
86 ver_b=("${ver_b[@]}")
87 fi
88 done
89 return 1 # They are equal
90}
91
a3e18d95
S
92prereqs() {
93
e741295a 94 # 1. docker daemon running?
30835a52
S
95 # we send stderr to /dev/null cause we don't care about warnings,
96 # it usually complains about swap which does not matter
97 test=`$docker_path info 2> /dev/null`
e741295a
MB
98
99 if [[ $? -ne 0 ]] ; then
100 echo "Cannot connect to the docker daemon - verify it is running and you have access"
101 exit 1
102 fi
103
185e78c6
S
104 # 2. running aufs or btrfs
105 test=`$docker_path info 2> /dev/null | grep 'Driver: '`
48f22d14
S
106 if [[ "$test" =~ [aufs|btrfs|zfs|overlay] ]] ; then : ; else
107 echo "Your Docker installation is not using a supported filesystem if we were to proceed you may have a broken install."
108 echo "aufs is the recommended filesystem you should be using (zfs/btrfs and overlay may work as well)"
109 echo "You can tell what filesystem you are using by running \"docker info\" and looking at the driver"
7d87f85f 110 echo ""
48f22d14
S
111 echo "If you wish to continue anyway using your existing unsupported filesystem"
112 echo "read the source code of launcher and figure out how to bypass this."
113 exit 1
a3e18d95
S
114 fi
115
60668406
DP
116 # 3. running recommended docker version
117 test=($($docker_path --version)) # Get docker version string
118 test=${test[2]//,/} # Get version alone and strip comma if exists
a3e18d95 119
cf00fce0
S
120 [[ "$test" =~ "0.12.0" ]] && echo "You are running a broken version of Docker, please upgrade ASAP. See: https://meta.discourse.org/t/the-installation-stopped-in-the-middle/16311/ for more details." && exit 1
121
60668406 122 # At least minimum version
cf00fce0 123 if compare_version "${docker_min_version}" "${test}"; then
60668406 124 echo "ERROR: Docker version ${test} not supported, please upgrade to at least ${docker_min_version}, or recommended ${docker_rec_version}"
a3e18d95
S
125 exit 1
126 fi
127
60668406
DP
128 # Recommend best version
129 if compare_version "${docker_rec_version}" "${test}"; then
130 echo "WARNING: Docker version ${test} deprecated, recommend upgrade to ${docker_rec_version} or newer."
131 fi
132
405948ee
S
133 # 4. discourse docker image is downloaded
134 test=`$docker_path images | awk '{print $1 ":" $2 }' | grep "$image"`
135
136 if [ -z "$test" ]; then
137 echo
138 echo "WARNING: We are about to start downloading the Discourse base image"
139 echo "This process may take anywhere between a few minutes to an hour, depending on your network speed"
140 echo
141 echo "Please be patient"
142 echo
143
144 fi
405948ee
S
145
146 # 5. able to attach stderr / out / tty
e02c1511 147 test=`$docker_path run $user_args -i --rm -a stdout -a stderr $image echo working`
a3e18d95
S
148 if [[ "$test" =~ "working" ]] ; then : ; else
149 echo "Your Docker installation is not working correctly"
150 echo
151 echo "See: https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam"
152 exit 1
153 fi
4770834b 154
6e784be6
MP
155}
156
157check_resources() {
158 # Memory
a752d8ea 159 resources="ok"
b3f0d057 160 avail_mem="$(LANG=C free -m | grep '^Mem:' | awk '{print $2}')"
a752d8ea
MP
161 if [ "$avail_mem" -lt 900 ]; then
162 resources="insufficient"
163 echo "WARNING: You do not appear to have sufficient memory to run Discourse."
164 echo
165 echo "Your system may not work properly, or future upgrades of Discourse may"
166 echo "not complete successfully."
b3f0d057
MP
167 echo
168 echo "See https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md#create-new-cloud-server"
a752d8ea 169 elif [ "$avail_mem" -lt 1800 ]; then
b3f0d057
MP
170 total_swap="$(LANG=C free -m | grep ^Swap: | awk '{print $2}')"
171 if [ "$total_swap" -lt 1000 ]; then
efd8ae0f 172 resources="insufficient"
a752d8ea
MP
173 echo "WARNING: You must have at least 1GB of swap when running with less"
174 echo "than 2GB of RAM."
175 echo
176 echo "Your system may not work properly, or future upgrades of Discourse may"
177 echo "not complete successfully."
b3f0d057
MP
178 echo
179 echo "See https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md#set-up-swap-if-needed"
b3f0d057
MP
180 fi
181 fi
4770834b 182
6e784be6 183 # Disk space
4770834b
MP
184 free_disk="$(df /var | tail -n 1 | awk '{print $4}')"
185 if [ "$free_disk" -lt 5000 ]; then
a752d8ea
MP
186 resources="insufficient"
187 echo "WARNING: You must have at least 5GB of *free* disk space to run Discourse."
188 echo
189 echo "Insufficient disk space may result in problems running your site, and may"
190 echo "not even allow Discourse installation to complete successfully."
4770834b
MP
191 echo
192 echo "Please free up some space, or expand your disk, before continuing."
193 exit 1
194 fi
a752d8ea
MP
195
196 if [ -t 0 ] && [ "$resources" != "ok" ]; then
197 echo
198 read -p "Press ENTER to continue, or Ctrl-C to exit and give your system more resources"
199 fi
a3e18d95
S
200}
201
55d17203
RW
202if [ "$opt" != "--skip-prereqs" ] ; then
203 prereqs
204fi
a3e18d95 205
e02c1511
S
206if [ "$opt" == "--docker-args" ] ; then
207 user_args=$4
208else
209 user_args=""
210fi
211
88126eba 212get_ssh_pub_key() {
c76db1ea
MK
213 local ${ssh_key_locations}
214 ssh_key_locations=(
841334d9
MK
215 ~/.ssh/id_ed25519.pub
216 ~/.ssh/id_ecdsa.pub
c76db1ea
MK
217 ~/.ssh/id_rsa.pub
218 ~/.ssh/id_dsa.pub
841334d9 219 ~core/.ssh/authorized_keys
c76db1ea
MK
220 )
221
222 local $keyfile
223 for keyfile in "${ssh_key_locations[@]}"; do
224 if [[ -e ${keyfile} ]] ; then
225 ssh_pub_key="$(cat ${keyfile})"
841334d9 226 return 0
c76db1ea
MK
227 fi
228 done
229
e3709631 230 return 0
88126eba
S
231}
232
233
52388b87
SS
234install_docker() {
235
5933f559
DP
236 echo "Docker is not installed, you will need to install Docker in order to run Discourse"
237 echo "Please visit https://docs.docker.com/installation/ for instructions on how to do this for your system"
52388b87 238 echo
5933f559 239 echo "If you are running Ubuntu Trusty or later, you can try the following:"
52388b87
SS
240 echo
241
b749fe0c 242 echo "sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D"
5933f559 243 echo "sudo sh -c \"echo deb https://apt.dockerproject.org/repo ubuntu-$(lsb_release -sc) main > /etc/apt/sources.list.d/docker.list\""
52388b87 244 echo "sudo apt-get update"
b749fe0c 245 echo "sudo apt-get install docker-engine"
52388b87
SS
246
247 exit 1
248}
249
60f9f04c
S
250host_run() {
251 read -r -d '' env_ruby << 'RUBY'
252 require 'yaml'
253
254 input = STDIN.readlines.join
255 yaml = YAML.load(input)
256
257 if host_run = yaml['host_run']
258 params = yaml['params'] || {}
259 host_run.each do |run|
260 params.each do |k,v|
261 run = run.gsub("$#{k}", v)
262 end
263 STDOUT.write "#{run}--SEP--"
264 end
265 end
266RUBY
267
e02c1511 268 host_run=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e "$env_ruby"`
60f9f04c
S
269
270 while [ "$host_run" ] ; do
271 iter=${host_run%%--SEP--*}
272 echo
273 echo "Host run: $iter"
274 $iter || exit 1
275 echo
276 host_run="${host_run#*--SEP--}"
277 done
278}
279
280
d90671f3 281set_volumes() {
e02c1511 282 volumes=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
d90671f3
SS
283 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
284}
285
41daa523 286set_links() {
e02c1511 287 links=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
41daa523 288 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['links'].map{|l| '--link ' << l['link']['name'] << ':' << l['link']['alias'] << ' '}.join"`
289}
290
7f77c274
SS
291set_template_info() {
292
e02c1511 293 templates=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
7f77c274
SS
294 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
295
296
297 arrTemplates=(${templates// / })
298 config_data=$(cat $config_file)
299
300 input="hack: true"
301
302
303 for template in "${arrTemplates[@]}"
304 do
305 [ ! -z $template ] && {
306 input="$input _FILE_SEPERATOR_ $(cat $template)"
307 }
308 done
309
310 # we always want our config file last so it takes priority
311 input="$input _FILE_SEPERATOR_ $config_data"
312
313 read -r -d '' env_ruby << 'RUBY'
314 require 'yaml'
315
316 input=STDIN.readlines.join
3cb3d9c4
S
317 # default to UTF-8 for the dbs sake
318 env = {'LANG' => 'en_US.UTF-8'}
7f77c274
SS
319 input.split('_FILE_SEPERATOR_').each do |yml|
320 yml.strip!
321 begin
322 env.merge!(YAML.load(yml)['env'] || {})
f3824347 323 rescue Psych::SyntaxError => e
324 puts e
325 puts "*ERROR."
7f77c274
SS
326 rescue => e
327 puts yml
328 p e
329 end
330 end
4b563ee8 331 puts env.map{|k,v| "-e\n#{k}=#{v}" }.join("\n")
7f77c274
SS
332RUBY
333
e02c1511 334 raw=`exec echo "$input" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
4b563ee8
SS
335
336 env=()
f3824347 337 ok=1
4b563ee8 338 while read i; do
f3824347 339 if [ "$i" == "*ERROR." ]; then
340 ok=0
341 elif [ -n "$i" ]; then
16f2d250
S
342 env[${#env[@]}]=$i
343 fi
4b563ee8
SS
344 done <<< "$raw"
345
f3824347 346 if [ "$ok" -ne 1 ]; then
347 echo "${env[@]}"
d6d1fb6e 348 echo "YAML syntax error. Please check your /var/discourse/containers/*.yml config files."
f3824347 349 exit 1
350 fi
7f77c274
SS
351}
352
52388b87
SS
353[ -z $docker_path ] && {
354 install_docker
355}
356
de869404 357[ "$command" == "cleanup" ] && {
c692f743
L
358 echo
359 echo "The following command will"
360 echo "- Delete all docker images for old containers"
361 echo "- Delete all stopped and orphan containers"
362 echo
363 read -p "Are you sure (Y/n): " -n 1 -r && echo
364 if [[ $REPLY =~ ^[Yy]$ || ! $REPLY ]]
365 then
30835a52 366 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
29a35d1b 367 echo "Starting Cleanup (bytes free $space)"
30835a52 368
29a35d1b 369 STATE_DIR=./.gc-state scripts/docker-gc
30835a52 370
29a35d1b
S
371 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
372 echo "Finished Cleanup (bytes free $space)"
30835a52 373
c692f743 374 else
30835a52 375 exit 1
c692f743 376 fi
a8b66f98
L
377 exit 0
378}
5f803fb4 379
c1005add 380[ $# -lt 2 ] && {
5f803fb4
SS
381 usage
382}
383
7e738616
S
384if [ ! -e $config_file ]
385 then
386 echo "Config file was not found, ensure $config_file exists"
71680b16
S
387 echo ""
388 echo "Available configs ( `cd containers && ls -dm *.yml | tr -s '\n' ' ' | awk '{ gsub(/\.yml/, ""); print }'`)"
7e738616
S
389 exit 1
390fi
391
337a89aa 392
e2ed1fb6
S
393docker_version=($($docker_path --version))
394docker_version=${test[2]//,/}
395
396if compare_version "1.2.0" "$docker_version"; then
397 echo "We recommend you upgrade docker, the version you are running has no restart policies, on reboot your container may not start up"
398 restart_policy=""
399else
e0fd1f5b 400 restart_policy=${restart_policy:---restart=always}
e2ed1fb6
S
401fi
402
30835a52 403set_existing_container(){
295e8f19 404 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
337a89aa
S
405}
406
30835a52 407run_stop(){
337a89aa 408
30835a52 409 set_existing_container
60f9f04c 410
30835a52 411 if [ ! -z $existing ]
337a89aa 412 then
30835a52
S
413 (
414 set -x
415 $docker_path stop -t 10 $config
416 )
337a89aa 417 else
30835a52
S
418 echo "$config was not started !"
419 exit 1
420 fi
421}
337a89aa 422
30835a52 423run_start(){
337a89aa 424
295e8f19
S
425 existing=`$docker_path ps | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
426 echo $existing
30835a52
S
427 if [ ! -z $existing ]
428 then
429 echo "Nothing to do, your container has already started!"
430 exit 1
431 fi
432
295e8f19 433 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
30835a52
S
434 if [ ! -z $existing ]
435 then
436 echo "starting up existing container"
437 (
438 set -x
439 $docker_path start $config
440 )
441 exit 0
442 fi
443
444 host_run
445 ports=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
446 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| '-p ' << p.to_s << ' '}.join"`
447
8b617e6e
PG
448 docker_args=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
449 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['docker_args']"`
450
30835a52
S
451 set_template_info
452 set_volumes
453 set_links
454
455 (
456 hostname=`hostname`
457 set -x
458 $docker_path run $user_args $links $attach_on_run $restart_policy "${env[@]}" -h "$hostname-$config" \
8b617e6e
PG
459 -e DOCKER_HOST_IP=$docker_ip --name $config -t $ports $volumes $docker_args $local_discourse/$config \
460 /sbin/boot
30835a52
S
461
462 )
463 exit 0
337a89aa
S
464
465}
466
680dd4ea 467run_bootstrap(){
60f9f04c 468
6e784be6
MP
469 check_resources
470
60f9f04c
S
471 host_run
472
680dd4ea 473 get_ssh_pub_key
88126eba 474
680dd4ea
S
475 # Is the image available?
476 # If not, pull it here so the user is aware what's happening.
4807b1b8 477 $docker_path history $image >/dev/null 2>&1 || $docker_path pull $image
88126eba 478
680dd4ea 479 set_template_info
93149421 480
e02c1511 481 base_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
680dd4ea 482 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
93149421 483
e02c1511 484 update_pups=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
680dd4ea 485 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
b9c7b50e 486
680dd4ea
S
487 if [[ ! X"" = X"$base_image" ]]; then
488 image=$base_image
489 fi
b9c7b50e 490
680dd4ea 491 set_volumes
41daa523 492 set_links
b9c7b50e 493
680dd4ea 494 rm -f $cidbootstrap
d90671f3 495
680dd4ea
S
496 run_command="cd /pups &&"
497 if [[ ! "false" = $update_pups ]]; then
498 run_command="$run_command git pull &&"
499 fi
500 run_command="$run_command /pups/bin/pups --stdin"
2162f1d4 501
680dd4ea 502 echo $run_command
b9c7b50e 503
680dd4ea 504 env=("${env[@]}" "-e" "SSH_PUB_KEY=$ssh_pub_key")
c4498636 505
e02c1511 506 (exec echo "$input" | $docker_path run $user_args $links "${env[@]}" -e DOCKER_HOST_IP=$docker_ip --cidfile $cidbootstrap -i -a stdin -a stdout -a stderr $volumes $image \
680dd4ea 507 /bin/bash -c "$run_command") \
4807b1b8 508 || ($docker_path rm `cat $cidbootstrap` && rm $cidbootstrap)
88126eba 509
4b733d87 510 [ ! -e $cidbootstrap ] && echo "** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one" && exit 1
9fb5f2d3 511
680dd4ea 512 sleep 5
2162f1d4 513
4807b1b8
MB
514 $docker_path commit `cat $cidbootstrap` $local_discourse/$config || echo 'FAILED TO COMMIT'
515 $docker_path rm `cat $cidbootstrap` && rm $cidbootstrap
680dd4ea 516}
9fb5f2d3 517
680dd4ea
S
518case "$command" in
519 bootstrap)
680dd4ea 520 run_bootstrap
2dd2e330 521 echo "Successfully bootstrapped, to startup use ./launcher start $config"
4b3aebe1 522 exit 0
5f803fb4 523 ;;
1acce9e4 524
2fc6ff36 525 enter)
30835a52 526 exec $docker_path exec -it $config /bin/bash
2fc6ff36
S
527 ;;
528
5f803fb4 529 ssh)
295e8f19 530 existing=`$docker_path ps | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
30835a52
S
531
532 if [[ ! -z $existing ]]; then
533 address="`$docker_path port $config 22`"
534 split=(${address//:/ })
535 exec ssh -o StrictHostKeyChecking=no root@${split[0]} -p ${split[1]}
536 else
537 echo "$config is not running!"
538 exit 1
539 fi
5f803fb4 540 ;;
7e738616 541
5f803fb4 542 stop)
337a89aa
S
543 run_stop
544 exit 0
5f803fb4 545 ;;
7e738616 546
5f803fb4 547 logs)
7e738616 548
30835a52
S
549 $docker_path logs $config
550 exit 0
5f803fb4 551 ;;
7e738616 552
337a89aa
S
553 restart)
554 run_stop
555 run_start
556 exit 0
557 ;;
80c11be3 558
337a89aa
S
559 start)
560 run_start
561 exit 0
5f803fb4 562 ;;
7e738616 563
680dd4ea 564 rebuild)
4b6456ef 565 if [ "$(git symbolic-ref --short HEAD)" == "master" ]; then
098533cb
S
566 echo "Ensuring discourse docker is up to date"
567
568 git remote update
569
570 LOCAL=$(git rev-parse @)
571 REMOTE=$(git rev-parse @{u})
572 BASE=$(git merge-base @ @{u})
573
574 if [ $LOCAL = $REMOTE ]; then
575 echo "Discourse Docker is up-to-date"
576
577 elif [ $LOCAL = $BASE ]; then
578 echo "Updating Discourse Docker"
579 git pull || (echo 'failed to update' && exit 1)
580 exec /bin/bash $0 $@
581
582 elif [ $REMOTE = $BASE ]; then
583 echo "Your version of Discourse Docker is ahead of origin"
584
585 else
905ec302 586 echo "Discourse Docker has diverged source, this is only expected in Dev mode"
098533cb
S
587 fi
588
4b6456ef 589 fi
30835a52
S
590
591 set_existing_container
592
593 if [ ! -z $existing ]
680dd4ea
S
594 then
595 echo "Stopping old container"
30835a52
S
596 (
597 set -x
598 $docker_path stop -t 10 $config
599 )
680dd4ea
S
600 fi
601
602 run_bootstrap
603
30835a52 604 if [ ! -z $existing ]
680dd4ea 605 then
30835a52
S
606 echo "Removing old container"
607 (
608 set -x
609 $docker_path rm $config
610 )
680dd4ea
S
611 fi
612
613 run_start
614 exit 0
615 ;;
616
7e738616 617
5f803fb4 618 destroy)
30835a52
S
619 (set -x; $docker_path stop -t 10 $config && $docker_path rm $config) || (echo "$config was not found" && exit 0)
620 exit 0
5f803fb4
SS
621 ;;
622esac
7e738616 623
5f803fb4 624usage