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