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