remove SSH command, improve valid check
[discourse_docker.git] / launcher
1 #!/bin/bash
2
3 command=$1
4 config=$2
5 opt=$3
6
7 # Docker doesn't like uppercase characters, spaces or special characters, catch it now before we build everything out and then find out
8 re='[A-Z/ !@#$%^&*()+~`=]'
9 if [[ $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
15 fi
16
17 cd "$(dirname "$0")"
18
19 docker_min_version='1.6.0'
20 docker_rec_version='1.6.0'
21
22 config_file=containers/"$config".yml
23 cidbootstrap=cids/"$config"_bootstrap.cid
24 local_discourse=local_discourse
25 image=discourse/discourse:1.0.17
26 docker_path=`which docker.io || which docker`
27 template_path=samples/standalone_template.yml
28 changelog=/tmp/changelog # used to test whether sed did anything
29
30 if [ "${SUPERVISED}" = "true" ]; then
31 restart_policy="--restart=no"
32 attach_on_start="-a"
33 attach_on_run="-a stdout -a stderr"
34 else
35 attach_on_run="-d"
36 fi
37
38 if [ -n "$DOCKER_HOST" ]; then
39 docker_ip=`sed -e 's/^tcp:\/\/\(.*\):.*$/\1/' <<< "$DOCKER_HOST"`
40 elif [ -x "$(which ip 2>/dev/null)" ]; then
41 docker_ip=`ip addr show docker0 | \
42 grep 'inet ' | \
43 awk '{ split($2,a,"/"); print a[1] }';`
44 else
45 docker_ip=`ifconfig | \
46 grep -B1 "inet addr" | \
47 awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' | \
48 grep docker0 | \
49 awk -F: '{ print $3 }';`
50 fi
51
52
53 usage () {
54 echo "Usage: launcher COMMAND CONFIG [--skip-prereqs]"
55 echo "Commands:"
56 echo " start: Start/initialize a container"
57 echo " stop: Stop a running container"
58 echo " restart: Restart a container"
59 echo " destroy: Stop and remove a container"
60 echo " enter: Use nsenter to enter a container"
61 echo " logs: Docker logs for container"
62 echo " bootstrap: Bootstrap a container for the config based on a template"
63 echo " rebuild: Rebuild a container (destroy old, bootstrap, start new)"
64 echo " memconfig: Configure defaults based on available RAM"
65 echo " cleanup: Remove all containers that have stopped for > 24 hours"
66 echo
67 echo "Options:"
68 echo " --skip-prereqs Don't check prerequisites or resource requirements"
69 echo " --docker-args Extra arguments to pass when running docker"
70 exit 1
71 }
72
73 compare_version() {
74 declare -a ver_a
75 declare -a ver_b
76 IFS=. read -a ver_a <<< "$1"
77 IFS=. read -a ver_b <<< "$2"
78
79 while [[ -n $ver_a ]]; do
80 if (( ver_a > ver_b )); then
81 return 0
82 elif (( ver_b > ver_a )); then
83 return 1
84 else
85 unset ver_a[0]
86 ver_a=("${ver_a[@]}")
87 unset ver_b[0]
88 ver_b=("${ver_b[@]}")
89 fi
90 done
91 return 1 # They are equal
92 }
93
94 prereqs() {
95
96 # 1. docker daemon running?
97 # we send stderr to /dev/null cause we don't care about warnings,
98 # it usually complains about swap which does not matter
99 test=`$docker_path info 2> /dev/null`
100
101 if [[ $? -ne 0 ]] ; then
102 echo "Cannot connect to the docker daemon - verify it is running and you have access"
103 exit 1
104 fi
105
106 # 2. running aufs or btrfs
107 test=`$docker_path info 2> /dev/null | grep 'Driver: '`
108 if [[ "$test" =~ [aufs|btrfs|zfs|overlay] ]] ; then : ; else
109 echo "Your Docker installation is not using a supported filesystem if we were to proceed you may have a broken install."
110 echo "aufs is the recommended filesystem you should be using (zfs/btrfs and overlay may work as well)"
111 echo "You can tell what filesystem you are using by running \"docker info\" and looking at the driver"
112 echo ""
113 echo "If you wish to continue anyway using your existing unsupported filesystem"
114 echo "read the source code of launcher and figure out how to bypass this."
115 exit 1
116 fi
117
118 # 3. running recommended docker version
119 test=($($docker_path --version)) # Get docker version string
120 test=${test[2]//,/} # Get version alone and strip comma if exists
121
122 # At least minimum version
123 if compare_version "${docker_min_version}" "${test}"; then
124 echo "ERROR: Docker version ${test} not supported, please upgrade to at least ${docker_min_version}, or recommended ${docker_rec_version}"
125 exit 1
126 fi
127
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
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
145
146 # 5. able to attach stderr / out / tty
147 test=`$docker_path run $user_args -i --rm -a stdout -a stderr $image echo working`
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
154
155 }
156
157 check_resources() {
158 # Memory
159 resources="ok"
160 avail_mem="$(LANG=C free -m | grep '^Mem:' | awk '{print $2}')"
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."
167 echo
168 echo "See https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md#create-new-cloud-server"
169 elif [ "$avail_mem" -lt 1800 ]; then
170 total_swap="$(LANG=C free -m | grep ^Swap: | awk '{print $2}')"
171 if [ "$total_swap" -lt 1000 ]; then
172 resources="insufficient"
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."
178 echo
179 echo "See https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md#set-up-swap-if-needed"
180 fi
181 fi
182
183 # Disk space
184 free_disk="$(df /var | tail -n 1 | awk '{print $4}')"
185 if [ "$free_disk" -lt 5000 ]; then
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."
191 echo
192 echo "Please free up some space, or expand your disk, before continuing."
193 exit 1
194 fi
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
200 }
201
202 check_ports() {
203 local valid=$(netstat -tln | awk '{print $4}' | grep ":${1}\$")
204
205 if [ -n "$valid" ]; then
206 echo "Launcher has detected that port ${1} is in use."
207 echo ""
208 echo "If you are trying to run Discourse simultaneously with another web server like Apache or nginx, you will need to bind to a different port."
209 echo "See https://meta.discourse.org/t/17247 for help."
210 echo "To continue anyway, re-run Launcher with --skip-prereqs"
211 exit 1
212 fi
213 }
214
215 if [ "$opt" != "--skip-prereqs" ] ; then
216 prereqs
217 fi
218
219 if [ "$opt" == "--docker-args" ] ; then
220 user_args=$4
221 else
222 user_args=""
223 fi
224
225 install_docker() {
226
227 echo "Docker is not installed, you will need to install Docker in order to run Discourse"
228 echo "Please visit https://docs.docker.com/installation/ for instructions on how to do this for your system"
229 echo
230 echo "If you are running Ubuntu Trusty or later, you can try the following:"
231 echo
232
233 echo "sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D"
234 echo "sudo sh -c \"echo deb https://apt.dockerproject.org/repo ubuntu-$(lsb_release -sc) main > /etc/apt/sources.list.d/docker.list\""
235 echo "sudo apt-get update"
236 echo "sudo apt-get install docker-engine"
237
238 exit 1
239 }
240
241 host_run() {
242 read -r -d '' env_ruby << 'RUBY'
243 require 'yaml'
244
245 input = STDIN.readlines.join
246 yaml = YAML.load(input)
247
248 if host_run = yaml['host_run']
249 params = yaml['params'] || {}
250 host_run.each do |run|
251 params.each do |k,v|
252 run = run.gsub("$#{k}", v)
253 end
254 STDOUT.write "#{run}--SEP--"
255 end
256 end
257 RUBY
258
259 host_run=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e "$env_ruby"`
260
261 while [ "$host_run" ] ; do
262 iter=${host_run%%--SEP--*}
263 echo
264 echo "Host run: $iter"
265 $iter || exit 1
266 echo
267 host_run="${host_run#*--SEP--}"
268 done
269 }
270
271
272 set_volumes() {
273 volumes=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
274 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
275 }
276
277 set_links() {
278 links=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
279 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['links'].map{|l| '--link ' << l['link']['name'] << ':' << l['link']['alias'] << ' '}.join"`
280 }
281
282 set_template_info() {
283
284 templates=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
285 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
286
287 arrTemplates=(${templates// / })
288 config_data=$(cat $config_file)
289
290 input="hack: true"
291
292 for template in "${arrTemplates[@]}"
293 do
294 [ ! -z $template ] && {
295 input="$input _FILE_SEPERATOR_ $(cat $template)"
296 }
297 done
298
299 # we always want our config file last so it takes priority
300 input="$input _FILE_SEPERATOR_ $config_data"
301
302 read -r -d '' env_ruby << 'RUBY'
303 require 'yaml'
304
305 input=STDIN.readlines.join
306 # default to UTF-8 for the dbs sake
307 env = {'LANG' => 'en_US.UTF-8'}
308 input.split('_FILE_SEPERATOR_').each do |yml|
309 yml.strip!
310 begin
311 env.merge!(YAML.load(yml)['env'] || {})
312 rescue Psych::SyntaxError => e
313 puts e
314 puts "*ERROR."
315 rescue => e
316 puts yml
317 p e
318 end
319 end
320 puts env.map{|k,v| "-e\n#{k}=#{v}" }.join("\n")
321 RUBY
322
323 raw=`exec echo "$input" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
324
325 env=()
326 ok=1
327 while read i; do
328 if [ "$i" == "*ERROR." ]; then
329 ok=0
330 elif [ -n "$i" ]; then
331 env[${#env[@]}]=$i
332 fi
333 done <<< "$raw"
334
335 if [ "$ok" -ne 1 ]; then
336 echo "${env[@]}"
337 echo "YAML syntax error. Please check your /var/discourse/containers/*.yml config files."
338 exit 1
339 fi
340 }
341
342 [ -z $docker_path ] && {
343 install_docker
344 }
345
346 [ "$command" == "cleanup" ] && {
347 echo
348 echo "The following command will"
349 echo "- Delete all docker images for old containers"
350 echo "- Delete all stopped and orphan containers"
351 echo
352 read -p "Are you sure (Y/n): " -n 1 -r && echo
353 if [[ $REPLY =~ ^[Yy]$ || ! $REPLY ]]
354 then
355 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
356 echo "Starting Cleanup (bytes free $space)"
357
358 STATE_DIR=./.gc-state scripts/docker-gc
359
360 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
361 echo "Finished Cleanup (bytes free $space)"
362
363 else
364 exit 1
365 fi
366 exit 0
367 }
368
369 [ $# -lt 2 ] && {
370 usage
371 }
372
373 if [[ ! -e $config_file && $command -ne "memconfig" ]]
374 then
375 echo "Config file was not found, ensure $config_file exists"
376 echo ""
377 echo "Available configs ( `cd containers && ls -dm *.yml | tr -s '\n' ' ' | awk '{ gsub(/\.yml/, ""); print }'`)"
378 exit 1
379 fi
380
381 docker_version=($($docker_path --version))
382 docker_version=${test[2]//,/}
383 restart_policy=${restart_policy:---restart=always}
384
385 set_existing_container(){
386 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
387 }
388
389 run_stop(){
390
391 set_existing_container
392
393 if [ ! -z $existing ]
394 then
395 (
396 set -x
397 $docker_path stop -t 10 $config
398 )
399 else
400 echo "$config was not started !"
401 exit 1
402 fi
403 }
404
405 set_run_image() {
406 run_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
407 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['run_image']"`
408
409 if [ -z "$run_image" ]; then
410 run_image="$local_discourse/$config"
411 fi
412 }
413
414 set_boot_command() {
415 boot_command=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
416 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['boot_command']"`
417
418 if [ -z "$boot_command" ]; then
419
420 no_boot_command=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
421 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['no_boot_command']"`
422
423 if [ -z "$no_boot_command" ]; then
424 boot_command="/sbin/boot"
425 fi
426 fi
427 }
428
429 run_memconfig(){
430 if [ "$opt" != "--skip-prereqs" ] ; then
431 check_resources
432 fi
433 if [ -f $config_file ]
434 then
435 cp $config_file $config_file.bak
436 echo "Saving $config_file as $config_file.bak"
437 else
438 echo "Creating $config_file from $template_path"
439 if [ ! -f $template_path ]
440 then
441 echo "$template_path is missing. Exiting."
442 exit 1
443 fi
444 cp $template_path $config_file
445 fi
446
447 # get free mem
448 avail_mem="$(LANG=C free -m | grep '^Mem:' | awk '{print $2}')"
449 avail_gb=`expr $(($avail_mem / 950))`
450 avail_cores=`grep -c processor /proc/cpuinfo`
451 echo "Found $avail_mem (${avail_gb}GB), of memory and $avail_cores cores."
452
453 # set db_shared_buffers: "128MB" (1GB) or 256MB * GB
454 if [ "$avail_gb" -eq "1" ]
455 then
456 db_shared_buffers="128"
457 else
458 db_shared_buffers=`expr $avail_gb \* 256`
459 fi
460 echo -e "Setting db_shared_buffers to ${db_shared_buffers}GB\c"
461 sed -i -e "s/^ db_shared_buffers:.*/ db_shared_buffers: \"${db_shared_buffers}GB\"/w $changelog" $config_file
462 if [ -s $changelog ]
463 then
464 echo " successfully."
465 rm $changelog
466 else
467 echo -e ". . . oops!\n---> db_shared_buffers not found in $config_file. Retaining defaults."
468 fi
469
470 # set UNICORN_WORKERS: 2*GB or 2*cores (the same on DO)
471 if [ "$avail_gb" -le "2" ]
472 then
473 unicorn_workers=`expr $avail_gb \* 2`
474 else
475 unicorn_workers=`expr $avail_cores \* 2`
476 fi
477
478 echo -e "Setting UNICORN_WORKERS to $unicorn_workers\c"
479 sed -i -e "s/^ UNICORN_WORKERS:.*/ UNICORN_WORKERS: ${unicorn_workers}/w $changelog" $config_file
480 if [ -s $changelog ]
481 then
482 echo " successfully."
483 rm $changelog
484 else
485 echo -e ". . . oops!\n---> UNICORN_WORKERS not found in $config_file. Retaining defaults.\n"
486 fi
487 }
488
489 run_start(){
490
491 existing=`$docker_path ps | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
492 echo $existing
493 if [ ! -z $existing ]
494 then
495 echo "Nothing to do, your container has already started!"
496 exit 1
497 fi
498
499 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
500 if [ ! -z $existing ]
501 then
502 echo "starting up existing container"
503 (
504 set -x
505 $docker_path start $config
506 )
507 exit 0
508 fi
509
510 host_run
511 ports=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
512 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| \"-p #{p}\"}.join(' ')"`
513
514 IFS='-p ' read -a array <<< "$ports"
515 for element in "${array[@]}"
516 do
517 IFS=':' read -a args <<< "$element"
518 if [ "${#args[@]}" == "2" ]; then
519 check_ports "${args[0]}"
520 elif [ "${#args[@]}" == "3" ]; then
521 check_ports "${args[1]}"
522 fi
523 done
524
525 docker_args=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
526 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['docker_args']"`
527
528 set_template_info
529 set_volumes
530 set_links
531 set_run_image
532 set_boot_command
533
534 # get hostname and settings from container configuration
535 for envar in "${env[@]}"
536 do
537 if [[ $envar == DOCKER_USE_HOSTNAME* ]] || [[ $envar == DISCOURSE_HOSTNAME* ]]
538 then
539 # use as environment variable
540 eval $envar
541 fi
542 done
543
544 (
545 hostname=`hostname -s`
546 # overwrite hostname
547 if [ "$DOCKER_USE_HOSTNAME" = "true" ]
548 then
549 hostname=$DISCOURSE_HOSTNAME
550 else
551 hostname=$hostname-$config
552 fi
553
554 # we got to normalize so we only have allowed strings, this is more comprehensive but lets see how bash does first
555 # hostname=`$docker_path run $user_args --rm $image ruby -e 'print ARGV[0].gsub(/[^a-zA-Z-]/, "-")' $hostname`
556 # docker added more hostname rules
557 hostname=${hostname/_/-}
558
559 set -x
560 $docker_path run $user_args $links $attach_on_run $restart_policy "${env[@]}" -h "$hostname" \
561 -e DOCKER_HOST_IP=$docker_ip --name $config -t $ports $volumes $docker_args $run_image $boot_command
562
563 )
564 exit 0
565
566 }
567
568 valid_config_check(){
569 valid_config="y"
570 for x in DISCOURSE_SMTP_ADDRESS DISCOURSE_SMTP_USER_NAME DISCOURSE_SMTP_PASSWORD \
571 DISCOURSE_DEVELOPER_EMAILS DISCOURSE_HOSTNAME
572 do
573 mail_var=`grep "^ $x:" $config_file`
574 result=$?
575 if (( result == 0 ))
576 then
577 if [[ $mail_var = *"example.com"* ]]
578 then
579 echo "Warning: $x left at incorrect default of example.com"
580 valid_config="n"
581 fi
582 else
583 echo "Warning: $x not configured."
584 valid_config="n"
585 fi
586 done
587 if [ -t 0 ] && [ "$valid_config" != "y" ]; then
588 echo
589 read -p "Press ENTER to continue, or Ctrl-C to exit and edit your config."
590 fi
591 }
592
593 run_bootstrap(){
594
595 if [ "$opt" != "--skip-prereqs" ] ; then
596 check_resources
597 fi
598
599 # is our configuration valid?
600 valid_config_check
601
602 host_run
603
604 # Is the image available?
605 # If not, pull it here so the user is aware what's happening.
606 $docker_path history $image >/dev/null 2>&1 || $docker_path pull $image
607
608 set_template_info
609
610 base_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
611 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
612
613 update_pups=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
614 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
615
616 if [[ ! X"" = X"$base_image" ]]; then
617 image=$base_image
618 fi
619
620 set_volumes
621 set_links
622
623 rm -f $cidbootstrap
624
625 run_command="cd /pups &&"
626 if [[ ! "false" = $update_pups ]]; then
627 run_command="$run_command git pull &&"
628 fi
629 run_command="$run_command /pups/bin/pups --stdin"
630
631 echo $run_command
632
633 (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 \
634 /bin/bash -c "$run_command") \
635 || ($docker_path rm `cat $cidbootstrap` && rm $cidbootstrap)
636
637 [ ! -e $cidbootstrap ] && echo "** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one" && exit 1
638
639 sleep 5
640
641 $docker_path commit `cat $cidbootstrap` $local_discourse/$config || echo 'FAILED TO COMMIT'
642 $docker_path rm `cat $cidbootstrap` && rm $cidbootstrap
643 }
644
645
646
647 case "$command" in
648 bootstrap)
649 run_bootstrap
650 echo "Successfully bootstrapped, to startup use ./launcher start $config"
651 exit 0
652 ;;
653
654 enter)
655 exec $docker_path exec -it $config /bin/bash --login
656 ;;
657
658 stop)
659 run_stop
660 exit 0
661 ;;
662
663 logs)
664
665 $docker_path logs $config
666 exit 0
667 ;;
668
669 restart)
670 run_stop
671 run_start
672 exit 0
673 ;;
674
675 start)
676 run_start
677 exit 0
678 ;;
679
680 memconfig)
681 run_memconfig
682 exit 0
683 ;;
684
685 rebuild)
686 if [ "$(git symbolic-ref --short HEAD)" == "master" ]; then
687 echo "Ensuring discourse docker is up to date"
688
689 git remote update
690
691 LOCAL=$(git rev-parse @)
692 REMOTE=$(git rev-parse @{u})
693 BASE=$(git merge-base @ @{u})
694
695 if [ $LOCAL = $REMOTE ]; then
696 echo "Discourse Docker is up-to-date"
697
698 elif [ $LOCAL = $BASE ]; then
699 echo "Updating Discourse Docker"
700 git pull || (echo 'failed to update' && exit 1)
701 exec /bin/bash $0 $@
702
703 elif [ $REMOTE = $BASE ]; then
704 echo "Your version of Discourse Docker is ahead of origin"
705
706 else
707 echo "Discourse Docker has diverged source, this is only expected in Dev mode"
708 fi
709
710 fi
711
712 set_existing_container
713
714 if [ ! -z $existing ]
715 then
716 echo "Stopping old container"
717 (
718 set -x
719 $docker_path stop -t 10 $config
720 )
721 fi
722
723 run_bootstrap
724
725 if [ ! -z $existing ]
726 then
727 echo "Removing old container"
728 (
729 set -x
730 $docker_path rm $config
731 )
732 fi
733
734 run_start
735 exit 0
736 ;;
737
738
739 destroy)
740 (set -x; $docker_path stop -t 10 $config && $docker_path rm $config) || (echo "$config was not found" && exit 0)
741 exit 0
742 ;;
743 esac
744
745 usage