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