FIX: More resilient docker fs space detection
[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
e7696e0d 67image=discourse/base:2.0.20170531
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
90287f8e 136 # 2. running an approved storage driver?
7644adb7 137 if ! $docker_path info 2> /dev/null | egrep -q '^Storage Driver: (aufs|btrfs|zfs|overlay|overlay2)$'; then
90287f8e 138 echo "Your Docker installation is not using a supported storage driver. If we were to proceed you may have a broken install."
7644adb7 139 echo "aufs is the recommended storage driver, although zfs/btrfs/overlay and overlay2 may work as well."
90287f8e
MP
140 echo "Other storage drivers are known to be problematic."
141 echo "You can tell what filesystem you are using by running \"docker info\" and looking at the 'Storage Driver' line."
5dfdf9a3 142 echo
90287f8e
MP
143 echo "If you wish to continue anyway using your existing unsupported storage driver,"
144 echo "read the source code of launcher and figure out how to bypass this check."
48f22d14 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
49b2fcc4 199 # 7. enough space for the bootstrap on docker folder
8cdc533d
RSS
200 folder=`$docker_path info --format '{{.DockerRootDir}}'`
201 safe_folder=${folder:-/var/lib/docker}
49b2fcc4
RSS
202 test=$(($(stat -f --format="%a*%S" $safe_folder)/1024**3 < 5))
203 if [[ $test -ne 0 ]] ; then
204 echo "You have less than 5GB of free space on the disk. You will need more space to continue"
205 echo
206 read -p "Would you like to attempt to recover space by cleaning docker images and containers in the system?(y/N)" -n 1 -r
207 echo
208 if [[ $REPLY =~ ^[Yy]$ ]]
209 then
210 docker system prune
211 echo "If the cleanup was successful, you may try again now"
212 fi
213 exit 1
214 fi
6e784be6
MP
215}
216
6828238a 217
1f656469 218if [ -z "$SKIP_PREREQS" ] ; then
87c4f221 219 check_prereqs
55d17203 220fi
a3e18d95 221
60f9f04c
S
222host_run() {
223 read -r -d '' env_ruby << 'RUBY'
224 require 'yaml'
225
226 input = STDIN.readlines.join
227 yaml = YAML.load(input)
228
229 if host_run = yaml['host_run']
230 params = yaml['params'] || {}
231 host_run.each do |run|
232 params.each do |k,v|
233 run = run.gsub("$#{k}", v)
234 end
235 STDOUT.write "#{run}--SEP--"
236 end
237 end
238RUBY
239
e02c1511 240 host_run=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e "$env_ruby"`
60f9f04c
S
241
242 while [ "$host_run" ] ; do
243 iter=${host_run%%--SEP--*}
244 echo
245 echo "Host run: $iter"
246 $iter || exit 1
247 echo
248 host_run="${host_run#*--SEP--}"
249 done
250}
251
252
d90671f3 253set_volumes() {
e02c1511 254 volumes=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
d90671f3
SS
255 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
256}
257
41daa523 258set_links() {
e02c1511 259 links=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
41daa523 260 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['links'].map{|l| '--link ' << l['link']['name'] << ':' << l['link']['alias'] << ' '}.join"`
261}
262
06310c73
GXT
263find_templates() {
264 local templates=`cat $1 | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
7f77c274
SS
265 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
266
06310c73
GXT
267 local arrTemplates=${templates// / }
268
2ec550f7 269 if [ ! -z "$templates" ]; then
06310c73
GXT
270 for template in "${arrTemplates[@]}"
271 do
272 local nested_templates=$(find_templates $template)
273
274 if [ ! -z "$nested_templates" ]; then
275 templates="$templates $nested_templates"
276 fi
277 done
278
279 echo $templates
280 else
281 echo ""
282 fi
283}
284
285set_template_info() {
286 templates=$(find_templates $config_file)
287
7f77c274
SS
288 arrTemplates=(${templates// / })
289 config_data=$(cat $config_file)
290
291 input="hack: true"
292
7f77c274
SS
293 for template in "${arrTemplates[@]}"
294 do
295 [ ! -z $template ] && {
296 input="$input _FILE_SEPERATOR_ $(cat $template)"
297 }
298 done
299
300 # we always want our config file last so it takes priority
301 input="$input _FILE_SEPERATOR_ $config_data"
302
303 read -r -d '' env_ruby << 'RUBY'
304 require 'yaml'
305
306 input=STDIN.readlines.join
3cb3d9c4
S
307 # default to UTF-8 for the dbs sake
308 env = {'LANG' => 'en_US.UTF-8'}
7f77c274
SS
309 input.split('_FILE_SEPERATOR_').each do |yml|
310 yml.strip!
311 begin
312 env.merge!(YAML.load(yml)['env'] || {})
f3824347 313 rescue Psych::SyntaxError => e
314 puts e
315 puts "*ERROR."
7f77c274
SS
316 rescue => e
317 puts yml
318 p e
319 end
320 end
4b563ee8 321 puts env.map{|k,v| "-e\n#{k}=#{v}" }.join("\n")
7f77c274
SS
322RUBY
323
e02c1511 324 raw=`exec echo "$input" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
4b563ee8
SS
325
326 env=()
f3824347 327 ok=1
4b563ee8 328 while read i; do
f3824347 329 if [ "$i" == "*ERROR." ]; then
330 ok=0
331 elif [ -n "$i" ]; then
16f2d250
S
332 env[${#env[@]}]=$i
333 fi
4b563ee8
SS
334 done <<< "$raw"
335
f3824347 336 if [ "$ok" -ne 1 ]; then
337 echo "${env[@]}"
c2d3ee4a 338 echo "YAML syntax error. Please check your containers/*.yml config files."
f3824347 339 exit 1
340 fi
762d9bbf
MP
341
342 read -r -d '' labels_ruby << 'RUBY'
343 require 'yaml'
344
345 input=STDIN.readlines.join
346 # default to UTF-8 for the dbs sake
347 labels = {}
348 input.split('_FILE_SEPERATOR_').each do |yml|
349 yml.strip!
350 begin
351 labels.merge!(YAML.load(yml)['labels'] || {})
352 rescue Psych::SyntaxError => e
353 puts e
354 puts "*ERROR."
355 rescue => e
356 puts yml
357 p e
358 end
359 end
360 puts labels.map{|k,v| "-l\n#{k}=#{v}" }.join("\n")
361RUBY
362
363 raw=`exec echo "$input" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$labels_ruby"`
364
365 labels=()
366 ok=1
367 while read i; do
368 if [ "$i" == "*ERROR." ]; then
369 ok=0
370 elif [ -n "$i" ]; then
371 labels[${#labels[@]}]=$i
372 fi
373 done <<< "$raw"
374
375 if [ "$ok" -ne 1 ]; then
376 echo "${labels[@]}"
377 echo "YAML syntax error. Please check your containers/*.yml config files."
378 exit 1
379 fi
7f77c274
SS
380}
381
665468eb 382if [ -z $docker_path ]; then
52388b87 383 install_docker
665468eb 384fi
52388b87 385
de869404 386[ "$command" == "cleanup" ] && {
c692f743
L
387 echo
388 echo "The following command will"
389 echo "- Delete all docker images for old containers"
390 echo "- Delete all stopped and orphan containers"
391 echo
392 read -p "Are you sure (Y/n): " -n 1 -r && echo
393 if [[ $REPLY =~ ^[Yy]$ || ! $REPLY ]]
394 then
30835a52 395 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
29a35d1b 396 echo "Starting Cleanup (bytes free $space)"
30835a52 397
29a35d1b 398 STATE_DIR=./.gc-state scripts/docker-gc
30835a52 399
29a35d1b
S
400 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
401 echo "Finished Cleanup (bytes free $space)"
30835a52 402
c692f743 403 else
30835a52 404 exit 1
c692f743 405 fi
a8b66f98
L
406 exit 0
407}
5f803fb4 408
65573a0e
GXT
409if [ -z "$command" -a -z "$config" ]; then
410 usage
411fi
412
413if [ ! "$command" == "setup" ]; then
414 if [[ ! -e $config_file ]]; then
7e738616 415 echo "Config file was not found, ensure $config_file exists"
5dfdf9a3 416 echo
71680b16 417 echo "Available configs ( `cd containers && ls -dm *.yml | tr -s '\n' ' ' | awk '{ gsub(/\.yml/, ""); print }'`)"
7e738616 418 exit 1
65573a0e 419 fi
7e738616
S
420fi
421
e2ed1fb6
S
422docker_version=($($docker_path --version))
423docker_version=${test[2]//,/}
69545efd 424restart_policy=${restart_policy:---restart=always}
e2ed1fb6 425
30835a52 426set_existing_container(){
295e8f19 427 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
337a89aa
S
428}
429
665468eb 430run_stop() {
337a89aa 431
30835a52 432 set_existing_container
60f9f04c 433
30835a52 434 if [ ! -z $existing ]
337a89aa 435 then
30835a52
S
436 (
437 set -x
a9cba0fc 438 $docker_path stop -t 10 $config
30835a52 439 )
337a89aa 440 else
30835a52
S
441 echo "$config was not started !"
442 exit 1
443 fi
444}
337a89aa 445
8877f99e
S
446set_run_image() {
447 run_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
448 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['run_image']"`
449
450 if [ -z "$run_image" ]; then
451 run_image="$local_discourse/$config"
452 fi
453}
454
455set_boot_command() {
456 boot_command=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
457 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['boot_command']"`
458
459 if [ -z "$boot_command" ]; then
460
461 no_boot_command=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
462 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['no_boot_command']"`
463
464 if [ -z "$no_boot_command" ]; then
465 boot_command="/sbin/boot"
466 fi
467 fi
468}
469
665468eb 470run_start() {
337a89aa 471
295e8f19
S
472 existing=`$docker_path ps | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
473 echo $existing
30835a52
S
474 if [ ! -z $existing ]
475 then
476 echo "Nothing to do, your container has already started!"
eac33309 477 exit 0
30835a52
S
478 fi
479
295e8f19 480 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
30835a52
S
481 if [ ! -z $existing ]
482 then
483 echo "starting up existing container"
484 (
485 set -x
486 $docker_path start $config
487 )
488 exit 0
489 fi
490
491 host_run
1f656469 492
afec9a51
GXT
493 ports=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
494 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| \"-p #{p}\"}.join(' ')"`
495
8b617e6e
PG
496 docker_args=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
497 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['docker_args']"`
498
30835a52
S
499 set_template_info
500 set_volumes
501 set_links
8877f99e
S
502 set_run_image
503 set_boot_command
30835a52 504
c6dd6f9d
FB
505 # get hostname and settings from container configuration
506 for envar in "${env[@]}"
507 do
508 if [[ $envar == DOCKER_USE_HOSTNAME* ]] || [[ $envar == DISCOURSE_HOSTNAME* ]]
509 then
510 # use as environment variable
511 eval $envar
512 fi
513 done
514
30835a52 515 (
c834fdd1 516 hostname=`hostname -s`
c6dd6f9d
FB
517 # overwrite hostname
518 if [ "$DOCKER_USE_HOSTNAME" = "true" ]
519 then
520 hostname=$DISCOURSE_HOSTNAME
521 else
522 hostname=$hostname-$config
523 fi
524
a0606001
S
525 # we got to normalize so we only have allowed strings, this is more comprehensive but lets see how bash does first
526 # hostname=`$docker_path run $user_args --rm $image ruby -e 'print ARGV[0].gsub(/[^a-zA-Z-]/, "-")' $hostname`
527 # docker added more hostname rules
fd2e7637 528 hostname=${hostname//_/-}
a0606001 529
cad2919f
GXT
530
531 if [ -z "$SKIP_MAC_ADDRESS" ] ; then
532 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/'")"
533 fi
d2a86ee1 534
30835a52 535 set -x
e00fca6e 536 $docker_path run $links $attach_on_run $restart_policy "${env[@]}" "${labels[@]}" -h "$hostname" \
bf268008 537 -e DOCKER_HOST_IP="$docker_ip" --name $config -t $ports $volumes $mac_address $docker_args $user_args \
d2a86ee1 538 $run_image $boot_command
30835a52
S
539
540 )
541 exit 0
337a89aa
S
542
543}
544
ec8f8b83 545
665468eb 546run_bootstrap() {
794e44d5 547
5dfdf9a3 548 # I got no frigging clue what this does, ask Sam Saffron. It RUNS STUFF ON THE HOST I GUESS?
60f9f04c
S
549 host_run
550
680dd4ea
S
551 # Is the image available?
552 # If not, pull it here so the user is aware what's happening.
4807b1b8 553 $docker_path history $image >/dev/null 2>&1 || $docker_path pull $image
88126eba 554
680dd4ea 555 set_template_info
93149421 556
e02c1511 557 base_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
680dd4ea 558 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
93149421 559
e02c1511 560 update_pups=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
680dd4ea 561 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
b9c7b50e 562
680dd4ea
S
563 if [[ ! X"" = X"$base_image" ]]; then
564 image=$base_image
565 fi
b9c7b50e 566
680dd4ea 567 set_volumes
41daa523 568 set_links
b9c7b50e 569
680dd4ea 570 rm -f $cidbootstrap
d90671f3 571
680dd4ea
S
572 run_command="cd /pups &&"
573 if [[ ! "false" = $update_pups ]]; then
574 run_command="$run_command git pull &&"
575 fi
ca2ce907 576 run_command="$run_command /pups/bin/pups --stdin"
2162f1d4 577
680dd4ea 578 echo $run_command
b9c7b50e 579
b4ab14c2 580 unset ERR
ca2ce907 581 (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
582 /bin/bash -c "$run_command") || ERR=$?
583
584 unset FAILED
585 # magic exit code that indicates a retry
586 if [[ "$ERR" == 77 ]]; then
382c8e40
S
587 $docker_path rm `cat $cidbootstrap`
588 rm $cidbootstrap
b4ab14c2 589 exit 77
382c8e40 590 elif [[ "$ERR" > 0 ]]; then
b4ab14c2
S
591 FAILED=TRUE
592 fi
19e3a6c0
S
593
594 if [[ $FAILED = "TRUE" ]]; then
595 if [[ ! -z "$DEBUG" ]]; then
596 $docker_path commit `cat $cidbootstrap` $local_discourse/$config-debug || echo 'FAILED TO COMMIT'
597 echo "** DEBUG ** Maintaining image for diagnostics $local_discourse/$config-debug"
598 fi
88126eba 599
19e3a6c0
S
600 $docker_path rm `cat $cidbootstrap`
601 rm $cidbootstrap
602 echo "** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one"
603 exit 1
604 fi
9fb5f2d3 605
680dd4ea 606 sleep 5
2162f1d4 607
4807b1b8
MB
608 $docker_path commit `cat $cidbootstrap` $local_discourse/$config || echo 'FAILED TO COMMIT'
609 $docker_path rm `cat $cidbootstrap` && rm $cidbootstrap
680dd4ea 610}
9fb5f2d3 611
8877f99e
S
612
613
680dd4ea
S
614case "$command" in
615 bootstrap)
680dd4ea 616 run_bootstrap
2dd2e330 617 echo "Successfully bootstrapped, to startup use ./launcher start $config"
4b3aebe1 618 exit 0
5f803fb4 619 ;;
1acce9e4 620
2fc6ff36 621 enter)
0c456e8c 622 exec $docker_path exec -it $config /bin/bash --login
2fc6ff36
S
623 ;;
624
5f803fb4 625 stop)
337a89aa
S
626 run_stop
627 exit 0
5f803fb4 628 ;;
7e738616 629
5f803fb4 630 logs)
7e738616 631
30835a52
S
632 $docker_path logs $config
633 exit 0
5f803fb4 634 ;;
7e738616 635
337a89aa
S
636 restart)
637 run_stop
638 run_start
639 exit 0
640 ;;
80c11be3 641
337a89aa
S
642 start)
643 run_start
644 exit 0
5f803fb4 645 ;;
7e738616 646
680dd4ea 647 rebuild)
4b6456ef 648 if [ "$(git symbolic-ref --short HEAD)" == "master" ]; then
c2d3ee4a 649 echo "Ensuring launcher is up to date"
098533cb
S
650
651 git remote update
652
653 LOCAL=$(git rev-parse @)
654 REMOTE=$(git rev-parse @{u})
655 BASE=$(git merge-base @ @{u})
656
657 if [ $LOCAL = $REMOTE ]; then
c2d3ee4a 658 echo "Launcher is up-to-date"
098533cb
S
659
660 elif [ $LOCAL = $BASE ]; then
c2d3ee4a 661 echo "Updating Launcher"
098533cb 662 git pull || (echo 'failed to update' && exit 1)
88ee2e35 663
8100fab0
PD
664 for (( i=${#BASH_ARGV[@]}-1,j=0; i>=0,j<${#BASH_ARGV[@]}; i--,j++ ))
665 do
666 args[$j]=${BASH_ARGV[$i]}
667 done
668 exec /bin/bash $0 "${args[@]}" # $@ is empty, because of shift at the beginning. Use BASH_ARGV instead.
098533cb
S
669
670 elif [ $REMOTE = $BASE ]; then
c2d3ee4a 671 echo "Your version of Launcher is ahead of origin"
098533cb
S
672
673 else
c2d3ee4a 674 echo "Launcher has diverged source, this is only expected in Dev mode"
098533cb
S
675 fi
676
4b6456ef 677 fi
30835a52
S
678
679 set_existing_container
680
681 if [ ! -z $existing ]
680dd4ea
S
682 then
683 echo "Stopping old container"
30835a52
S
684 (
685 set -x
686 $docker_path stop -t 10 $config
687 )
680dd4ea
S
688 fi
689
690 run_bootstrap
691
30835a52 692 if [ ! -z $existing ]
680dd4ea 693 then
30835a52
S
694 echo "Removing old container"
695 (
696 set -x
697 $docker_path rm $config
698 )
680dd4ea
S
699 fi
700
701 run_start
702 exit 0
703 ;;
704
7e738616 705
5f803fb4 706 destroy)
98bd0edf 707 (set -x; $docker_path stop -t 10 $config && $docker_path rm $config) || (echo "$config was not found" && exit 0)
30835a52 708 exit 0
5f803fb4
SS
709 ;;
710esac
7e738616 711
5f803fb4 712usage