use docker-gc docker image
[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
MP
154
155 # 6. sufficient available resources
156 # 6a. Memory
387cb954 157 #
a752d8ea 158 resources="ok"
b3f0d057 159 avail_mem="$(LANG=C free -m | grep '^Mem:' | awk '{print $2}')"
a752d8ea
MP
160 if [ "$avail_mem" -lt 900 ]; then
161 resources="insufficient"
162 echo "WARNING: You do not appear to have sufficient memory to run Discourse."
163 echo
164 echo "Your system may not work properly, or future upgrades of Discourse may"
165 echo "not complete successfully."
b3f0d057
MP
166 echo
167 echo "See https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md#create-new-cloud-server"
a752d8ea 168 elif [ "$avail_mem" -lt 1800 ]; then
b3f0d057
MP
169 total_swap="$(LANG=C free -m | grep ^Swap: | awk '{print $2}')"
170 if [ "$total_swap" -lt 1000 ]; then
efd8ae0f 171 resources="insufficient"
a752d8ea
MP
172 echo "WARNING: You must have at least 1GB of swap when running with less"
173 echo "than 2GB of RAM."
174 echo
175 echo "Your system may not work properly, or future upgrades of Discourse may"
176 echo "not complete successfully."
b3f0d057
MP
177 echo
178 echo "See https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md#set-up-swap-if-needed"
b3f0d057
MP
179 fi
180 fi
4770834b
MP
181
182 # 6b. Disk space
183 free_disk="$(df /var | tail -n 1 | awk '{print $4}')"
184 if [ "$free_disk" -lt 5000 ]; then
a752d8ea
MP
185 resources="insufficient"
186 echo "WARNING: You must have at least 5GB of *free* disk space to run Discourse."
187 echo
188 echo "Insufficient disk space may result in problems running your site, and may"
189 echo "not even allow Discourse installation to complete successfully."
4770834b
MP
190 echo
191 echo "Please free up some space, or expand your disk, before continuing."
192 exit 1
193 fi
a752d8ea
MP
194
195 if [ -t 0 ] && [ "$resources" != "ok" ]; then
196 echo
197 read -p "Press ENTER to continue, or Ctrl-C to exit and give your system more resources"
198 fi
a3e18d95
S
199}
200
55d17203
RW
201if [ "$opt" != "--skip-prereqs" ] ; then
202 prereqs
203fi
a3e18d95 204
e02c1511
S
205if [ "$opt" == "--docker-args" ] ; then
206 user_args=$4
207else
208 user_args=""
209fi
210
88126eba 211get_ssh_pub_key() {
c76db1ea
MK
212 local ${ssh_key_locations}
213 ssh_key_locations=(
841334d9
MK
214 ~/.ssh/id_ed25519.pub
215 ~/.ssh/id_ecdsa.pub
c76db1ea
MK
216 ~/.ssh/id_rsa.pub
217 ~/.ssh/id_dsa.pub
841334d9 218 ~core/.ssh/authorized_keys
c76db1ea
MK
219 )
220
221 local $keyfile
222 for keyfile in "${ssh_key_locations[@]}"; do
223 if [[ -e ${keyfile} ]] ; then
224 ssh_pub_key="$(cat ${keyfile})"
841334d9 225 return 0
c76db1ea
MK
226 fi
227 done
228
e3709631 229 return 0
88126eba
S
230}
231
232
52388b87
SS
233install_docker() {
234
5933f559
DP
235 echo "Docker is not installed, you will need to install Docker in order to run Discourse"
236 echo "Please visit https://docs.docker.com/installation/ for instructions on how to do this for your system"
52388b87 237 echo
5933f559 238 echo "If you are running Ubuntu Trusty or later, you can try the following:"
52388b87
SS
239 echo
240
b749fe0c 241 echo "sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D"
5933f559 242 echo "sudo sh -c \"echo deb https://apt.dockerproject.org/repo ubuntu-$(lsb_release -sc) main > /etc/apt/sources.list.d/docker.list\""
52388b87 243 echo "sudo apt-get update"
b749fe0c 244 echo "sudo apt-get install docker-engine"
52388b87
SS
245
246 exit 1
247}
248
60f9f04c
S
249host_run() {
250 read -r -d '' env_ruby << 'RUBY'
251 require 'yaml'
252
253 input = STDIN.readlines.join
254 yaml = YAML.load(input)
255
256 if host_run = yaml['host_run']
257 params = yaml['params'] || {}
258 host_run.each do |run|
259 params.each do |k,v|
260 run = run.gsub("$#{k}", v)
261 end
262 STDOUT.write "#{run}--SEP--"
263 end
264 end
265RUBY
266
e02c1511 267 host_run=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e "$env_ruby"`
60f9f04c
S
268
269 while [ "$host_run" ] ; do
270 iter=${host_run%%--SEP--*}
271 echo
272 echo "Host run: $iter"
273 $iter || exit 1
274 echo
275 host_run="${host_run#*--SEP--}"
276 done
277}
278
279
d90671f3 280set_volumes() {
e02c1511 281 volumes=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
d90671f3
SS
282 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
283}
284
41daa523 285set_links() {
e02c1511 286 links=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
41daa523 287 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['links'].map{|l| '--link ' << l['link']['name'] << ':' << l['link']['alias'] << ' '}.join"`
288}
289
7f77c274
SS
290set_template_info() {
291
e02c1511 292 templates=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
7f77c274
SS
293 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
294
295
296 arrTemplates=(${templates// / })
297 config_data=$(cat $config_file)
298
299 input="hack: true"
300
301
302 for template in "${arrTemplates[@]}"
303 do
304 [ ! -z $template ] && {
305 input="$input _FILE_SEPERATOR_ $(cat $template)"
306 }
307 done
308
309 # we always want our config file last so it takes priority
310 input="$input _FILE_SEPERATOR_ $config_data"
311
312 read -r -d '' env_ruby << 'RUBY'
313 require 'yaml'
314
315 input=STDIN.readlines.join
3cb3d9c4
S
316 # default to UTF-8 for the dbs sake
317 env = {'LANG' => 'en_US.UTF-8'}
7f77c274
SS
318 input.split('_FILE_SEPERATOR_').each do |yml|
319 yml.strip!
320 begin
321 env.merge!(YAML.load(yml)['env'] || {})
f3824347 322 rescue Psych::SyntaxError => e
323 puts e
324 puts "*ERROR."
7f77c274
SS
325 rescue => e
326 puts yml
327 p e
328 end
329 end
4b563ee8 330 puts env.map{|k,v| "-e\n#{k}=#{v}" }.join("\n")
7f77c274
SS
331RUBY
332
e02c1511 333 raw=`exec echo "$input" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
4b563ee8
SS
334
335 env=()
f3824347 336 ok=1
4b563ee8 337 while read i; do
f3824347 338 if [ "$i" == "*ERROR." ]; then
339 ok=0
340 elif [ -n "$i" ]; then
16f2d250
S
341 env[${#env[@]}]=$i
342 fi
4b563ee8
SS
343 done <<< "$raw"
344
f3824347 345 if [ "$ok" -ne 1 ]; then
346 echo "${env[@]}"
d6d1fb6e 347 echo "YAML syntax error. Please check your /var/discourse/containers/*.yml config files."
f3824347 348 exit 1
349 fi
7f77c274
SS
350}
351
52388b87
SS
352[ -z $docker_path ] && {
353 install_docker
354}
355
de869404 356[ "$command" == "cleanup" ] && {
c692f743
L
357 echo
358 echo "The following command will"
359 echo "- Delete all docker images for old containers"
360 echo "- Delete all stopped and orphan containers"
361 echo
362 read -p "Are you sure (Y/n): " -n 1 -r && echo
363 if [[ $REPLY =~ ^[Yy]$ || ! $REPLY ]]
364 then
30835a52 365 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
29a35d1b 366 echo "Starting Cleanup (bytes free $space)"
30835a52 367
29a35d1b 368 STATE_DIR=./.gc-state scripts/docker-gc
30835a52 369
29a35d1b
S
370 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
371 echo "Finished Cleanup (bytes free $space)"
30835a52 372
c692f743 373 else
30835a52 374 exit 1
c692f743 375 fi
a8b66f98
L
376 exit 0
377}
5f803fb4 378
c1005add 379[ $# -lt 2 ] && {
5f803fb4
SS
380 usage
381}
382
7e738616
S
383if [ ! -e $config_file ]
384 then
385 echo "Config file was not found, ensure $config_file exists"
71680b16
S
386 echo ""
387 echo "Available configs ( `cd containers && ls -dm *.yml | tr -s '\n' ' ' | awk '{ gsub(/\.yml/, ""); print }'`)"
7e738616
S
388 exit 1
389fi
390
337a89aa 391
e2ed1fb6
S
392docker_version=($($docker_path --version))
393docker_version=${test[2]//,/}
394
395if compare_version "1.2.0" "$docker_version"; then
396 echo "We recommend you upgrade docker, the version you are running has no restart policies, on reboot your container may not start up"
397 restart_policy=""
398else
e0fd1f5b 399 restart_policy=${restart_policy:---restart=always}
e2ed1fb6
S
400fi
401
30835a52 402set_existing_container(){
295e8f19 403 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
337a89aa
S
404}
405
30835a52 406run_stop(){
337a89aa 407
30835a52 408 set_existing_container
60f9f04c 409
30835a52 410 if [ ! -z $existing ]
337a89aa 411 then
30835a52
S
412 (
413 set -x
414 $docker_path stop -t 10 $config
415 )
337a89aa 416 else
30835a52
S
417 echo "$config was not started !"
418 exit 1
419 fi
420}
337a89aa 421
30835a52 422run_start(){
337a89aa 423
295e8f19
S
424 existing=`$docker_path ps | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
425 echo $existing
30835a52
S
426 if [ ! -z $existing ]
427 then
428 echo "Nothing to do, your container has already started!"
429 exit 1
430 fi
431
295e8f19 432 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
30835a52
S
433 if [ ! -z $existing ]
434 then
435 echo "starting up existing container"
436 (
437 set -x
438 $docker_path start $config
439 )
440 exit 0
441 fi
442
443 host_run
444 ports=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
445 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| '-p ' << p.to_s << ' '}.join"`
446
8b617e6e
PG
447 docker_args=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
448 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['docker_args']"`
449
30835a52
S
450 set_template_info
451 set_volumes
452 set_links
453
454 (
455 hostname=`hostname`
456 set -x
457 $docker_path run $user_args $links $attach_on_run $restart_policy "${env[@]}" -h "$hostname-$config" \
8b617e6e
PG
458 -e DOCKER_HOST_IP=$docker_ip --name $config -t $ports $volumes $docker_args $local_discourse/$config \
459 /sbin/boot
30835a52
S
460
461 )
462 exit 0
337a89aa
S
463
464}
465
680dd4ea 466run_bootstrap(){
60f9f04c
S
467
468 host_run
469
680dd4ea 470 get_ssh_pub_key
88126eba 471
680dd4ea
S
472 # Is the image available?
473 # If not, pull it here so the user is aware what's happening.
4807b1b8 474 $docker_path history $image >/dev/null 2>&1 || $docker_path pull $image
88126eba 475
680dd4ea 476 set_template_info
93149421 477
e02c1511 478 base_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
680dd4ea 479 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
93149421 480
e02c1511 481 update_pups=`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)['update_pups']"`
b9c7b50e 483
680dd4ea
S
484 if [[ ! X"" = X"$base_image" ]]; then
485 image=$base_image
486 fi
b9c7b50e 487
680dd4ea 488 set_volumes
41daa523 489 set_links
b9c7b50e 490
680dd4ea 491 rm -f $cidbootstrap
d90671f3 492
680dd4ea
S
493 run_command="cd /pups &&"
494 if [[ ! "false" = $update_pups ]]; then
495 run_command="$run_command git pull &&"
496 fi
497 run_command="$run_command /pups/bin/pups --stdin"
2162f1d4 498
680dd4ea 499 echo $run_command
b9c7b50e 500
680dd4ea 501 env=("${env[@]}" "-e" "SSH_PUB_KEY=$ssh_pub_key")
c4498636 502
e02c1511 503 (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 504 /bin/bash -c "$run_command") \
4807b1b8 505 || ($docker_path rm `cat $cidbootstrap` && rm $cidbootstrap)
88126eba 506
4b733d87 507 [ ! -e $cidbootstrap ] && echo "** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one" && exit 1
9fb5f2d3 508
680dd4ea 509 sleep 5
2162f1d4 510
4807b1b8
MB
511 $docker_path commit `cat $cidbootstrap` $local_discourse/$config || echo 'FAILED TO COMMIT'
512 $docker_path rm `cat $cidbootstrap` && rm $cidbootstrap
680dd4ea 513}
9fb5f2d3 514
680dd4ea
S
515case "$command" in
516 bootstrap)
680dd4ea 517 run_bootstrap
2dd2e330 518 echo "Successfully bootstrapped, to startup use ./launcher start $config"
4b3aebe1 519 exit 0
5f803fb4 520 ;;
1acce9e4 521
2fc6ff36 522 enter)
30835a52 523 exec $docker_path exec -it $config /bin/bash
2fc6ff36
S
524 ;;
525
5f803fb4 526 ssh)
295e8f19 527 existing=`$docker_path ps | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
30835a52
S
528
529 if [[ ! -z $existing ]]; then
530 address="`$docker_path port $config 22`"
531 split=(${address//:/ })
532 exec ssh -o StrictHostKeyChecking=no root@${split[0]} -p ${split[1]}
533 else
534 echo "$config is not running!"
535 exit 1
536 fi
5f803fb4 537 ;;
7e738616 538
5f803fb4 539 stop)
337a89aa
S
540 run_stop
541 exit 0
5f803fb4 542 ;;
7e738616 543
5f803fb4 544 logs)
7e738616 545
30835a52
S
546 $docker_path logs $config
547 exit 0
5f803fb4 548 ;;
7e738616 549
337a89aa
S
550 restart)
551 run_stop
552 run_start
553 exit 0
554 ;;
80c11be3 555
337a89aa
S
556 start)
557 run_start
558 exit 0
5f803fb4 559 ;;
7e738616 560
680dd4ea 561 rebuild)
4b6456ef 562 if [ "$(git symbolic-ref --short HEAD)" == "master" ]; then
098533cb
S
563 echo "Ensuring discourse docker is up to date"
564
565 git remote update
566
567 LOCAL=$(git rev-parse @)
568 REMOTE=$(git rev-parse @{u})
569 BASE=$(git merge-base @ @{u})
570
571 if [ $LOCAL = $REMOTE ]; then
572 echo "Discourse Docker is up-to-date"
573
574 elif [ $LOCAL = $BASE ]; then
575 echo "Updating Discourse Docker"
576 git pull || (echo 'failed to update' && exit 1)
577 exec /bin/bash $0 $@
578
579 elif [ $REMOTE = $BASE ]; then
580 echo "Your version of Discourse Docker is ahead of origin"
581
582 else
905ec302 583 echo "Discourse Docker has diverged source, this is only expected in Dev mode"
098533cb
S
584 fi
585
4b6456ef 586 fi
30835a52
S
587
588 set_existing_container
589
590 if [ ! -z $existing ]
680dd4ea
S
591 then
592 echo "Stopping old container"
30835a52
S
593 (
594 set -x
595 $docker_path stop -t 10 $config
596 )
680dd4ea
S
597 fi
598
599 run_bootstrap
600
30835a52 601 if [ ! -z $existing ]
680dd4ea 602 then
30835a52
S
603 echo "Removing old container"
604 (
605 set -x
606 $docker_path rm $config
607 )
680dd4ea
S
608 fi
609
610 run_start
611 exit 0
612 ;;
613
7e738616 614
5f803fb4 615 destroy)
30835a52
S
616 (set -x; $docker_path stop -t 10 $config && $docker_path rm $config) || (echo "$config was not found" && exit 0)
617 exit 0
5f803fb4
SS
618 ;;
619esac
7e738616 620
5f803fb4 621usage