docker amended hostname rules, comply...
[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
fecfcdcf 25image=discourse/discourse:1.0.17
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
c574dbda
GXT
203check_ports() {
204 local valid=$(netstat -tln | awk '{print $4}' | grep ":${1}\$")
205
206 if [ -n "$valid" ]; then
207 echo "Launcher has detected that port ${1} is in use."
208 echo ""
209 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."
210 echo "See https://meta.discourse.org/t/17247 for help."
1410a21f 211 echo "To continue anyway, re-run Launcher with --skip-prereqs"
c574dbda
GXT
212 exit 1
213 fi
214}
215
55d17203
RW
216if [ "$opt" != "--skip-prereqs" ] ; then
217 prereqs
218fi
a3e18d95 219
e02c1511
S
220if [ "$opt" == "--docker-args" ] ; then
221 user_args=$4
222else
223 user_args=""
224fi
225
88126eba 226get_ssh_pub_key() {
c76db1ea
MK
227 local ${ssh_key_locations}
228 ssh_key_locations=(
841334d9
MK
229 ~/.ssh/id_ed25519.pub
230 ~/.ssh/id_ecdsa.pub
c76db1ea
MK
231 ~/.ssh/id_rsa.pub
232 ~/.ssh/id_dsa.pub
841334d9 233 ~core/.ssh/authorized_keys
c76db1ea
MK
234 )
235
236 local $keyfile
237 for keyfile in "${ssh_key_locations[@]}"; do
238 if [[ -e ${keyfile} ]] ; then
239 ssh_pub_key="$(cat ${keyfile})"
841334d9 240 return 0
c76db1ea
MK
241 fi
242 done
243
e3709631 244 return 0
88126eba
S
245}
246
247
52388b87
SS
248install_docker() {
249
5933f559
DP
250 echo "Docker is not installed, you will need to install Docker in order to run Discourse"
251 echo "Please visit https://docs.docker.com/installation/ for instructions on how to do this for your system"
52388b87 252 echo
5933f559 253 echo "If you are running Ubuntu Trusty or later, you can try the following:"
52388b87
SS
254 echo
255
b749fe0c 256 echo "sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D"
5933f559 257 echo "sudo sh -c \"echo deb https://apt.dockerproject.org/repo ubuntu-$(lsb_release -sc) main > /etc/apt/sources.list.d/docker.list\""
52388b87 258 echo "sudo apt-get update"
b749fe0c 259 echo "sudo apt-get install docker-engine"
52388b87
SS
260
261 exit 1
262}
263
60f9f04c
S
264host_run() {
265 read -r -d '' env_ruby << 'RUBY'
266 require 'yaml'
267
268 input = STDIN.readlines.join
269 yaml = YAML.load(input)
270
271 if host_run = yaml['host_run']
272 params = yaml['params'] || {}
273 host_run.each do |run|
274 params.each do |k,v|
275 run = run.gsub("$#{k}", v)
276 end
277 STDOUT.write "#{run}--SEP--"
278 end
279 end
280RUBY
281
e02c1511 282 host_run=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e "$env_ruby"`
60f9f04c
S
283
284 while [ "$host_run" ] ; do
285 iter=${host_run%%--SEP--*}
286 echo
287 echo "Host run: $iter"
288 $iter || exit 1
289 echo
290 host_run="${host_run#*--SEP--}"
291 done
292}
293
294
d90671f3 295set_volumes() {
e02c1511 296 volumes=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
d90671f3
SS
297 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
298}
299
41daa523 300set_links() {
e02c1511 301 links=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
41daa523 302 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['links'].map{|l| '--link ' << l['link']['name'] << ':' << l['link']['alias'] << ' '}.join"`
303}
304
7f77c274
SS
305set_template_info() {
306
e02c1511 307 templates=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
7f77c274
SS
308 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
309
310
311 arrTemplates=(${templates// / })
312 config_data=$(cat $config_file)
313
314 input="hack: true"
315
316
317 for template in "${arrTemplates[@]}"
318 do
319 [ ! -z $template ] && {
320 input="$input _FILE_SEPERATOR_ $(cat $template)"
321 }
322 done
323
324 # we always want our config file last so it takes priority
325 input="$input _FILE_SEPERATOR_ $config_data"
326
327 read -r -d '' env_ruby << 'RUBY'
328 require 'yaml'
329
330 input=STDIN.readlines.join
3cb3d9c4
S
331 # default to UTF-8 for the dbs sake
332 env = {'LANG' => 'en_US.UTF-8'}
7f77c274
SS
333 input.split('_FILE_SEPERATOR_').each do |yml|
334 yml.strip!
335 begin
336 env.merge!(YAML.load(yml)['env'] || {})
f3824347 337 rescue Psych::SyntaxError => e
338 puts e
339 puts "*ERROR."
7f77c274
SS
340 rescue => e
341 puts yml
342 p e
343 end
344 end
4b563ee8 345 puts env.map{|k,v| "-e\n#{k}=#{v}" }.join("\n")
7f77c274
SS
346RUBY
347
e02c1511 348 raw=`exec echo "$input" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
4b563ee8
SS
349
350 env=()
f3824347 351 ok=1
4b563ee8 352 while read i; do
f3824347 353 if [ "$i" == "*ERROR." ]; then
354 ok=0
355 elif [ -n "$i" ]; then
16f2d250
S
356 env[${#env[@]}]=$i
357 fi
4b563ee8
SS
358 done <<< "$raw"
359
f3824347 360 if [ "$ok" -ne 1 ]; then
361 echo "${env[@]}"
d6d1fb6e 362 echo "YAML syntax error. Please check your /var/discourse/containers/*.yml config files."
f3824347 363 exit 1
364 fi
7f77c274
SS
365}
366
52388b87
SS
367[ -z $docker_path ] && {
368 install_docker
369}
370
de869404 371[ "$command" == "cleanup" ] && {
c692f743
L
372 echo
373 echo "The following command will"
374 echo "- Delete all docker images for old containers"
375 echo "- Delete all stopped and orphan containers"
376 echo
377 read -p "Are you sure (Y/n): " -n 1 -r && echo
378 if [[ $REPLY =~ ^[Yy]$ || ! $REPLY ]]
379 then
30835a52 380 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
29a35d1b 381 echo "Starting Cleanup (bytes free $space)"
30835a52 382
29a35d1b 383 STATE_DIR=./.gc-state scripts/docker-gc
30835a52 384
29a35d1b
S
385 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
386 echo "Finished Cleanup (bytes free $space)"
30835a52 387
c692f743 388 else
30835a52 389 exit 1
c692f743 390 fi
a8b66f98
L
391 exit 0
392}
5f803fb4 393
c1005add 394[ $# -lt 2 ] && {
5f803fb4
SS
395 usage
396}
397
7e738616
S
398if [ ! -e $config_file ]
399 then
400 echo "Config file was not found, ensure $config_file exists"
71680b16
S
401 echo ""
402 echo "Available configs ( `cd containers && ls -dm *.yml | tr -s '\n' ' ' | awk '{ gsub(/\.yml/, ""); print }'`)"
7e738616
S
403 exit 1
404fi
405
337a89aa 406
e2ed1fb6
S
407docker_version=($($docker_path --version))
408docker_version=${test[2]//,/}
409
410if compare_version "1.2.0" "$docker_version"; then
411 echo "We recommend you upgrade docker, the version you are running has no restart policies, on reboot your container may not start up"
412 restart_policy=""
413else
e0fd1f5b 414 restart_policy=${restart_policy:---restart=always}
e2ed1fb6
S
415fi
416
30835a52 417set_existing_container(){
295e8f19 418 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
337a89aa
S
419}
420
30835a52 421run_stop(){
337a89aa 422
30835a52 423 set_existing_container
60f9f04c 424
30835a52 425 if [ ! -z $existing ]
337a89aa 426 then
30835a52
S
427 (
428 set -x
429 $docker_path stop -t 10 $config
430 )
337a89aa 431 else
30835a52
S
432 echo "$config was not started !"
433 exit 1
434 fi
435}
337a89aa 436
8877f99e
S
437set_run_image() {
438 run_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
439 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['run_image']"`
440
441 if [ -z "$run_image" ]; then
442 run_image="$local_discourse/$config"
443 fi
444}
445
446set_boot_command() {
447 boot_command=`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)['boot_command']"`
449
450 if [ -z "$boot_command" ]; then
451
452 no_boot_command=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
453 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['no_boot_command']"`
454
455 if [ -z "$no_boot_command" ]; then
456 boot_command="/sbin/boot"
457 fi
458 fi
459}
460
30835a52 461run_start(){
337a89aa 462
295e8f19
S
463 existing=`$docker_path ps | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
464 echo $existing
30835a52
S
465 if [ ! -z $existing ]
466 then
467 echo "Nothing to do, your container has already started!"
468 exit 1
469 fi
470
295e8f19 471 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
30835a52
S
472 if [ ! -z $existing ]
473 then
474 echo "starting up existing container"
475 (
476 set -x
477 $docker_path start $config
478 )
479 exit 0
480 fi
481
482 host_run
483 ports=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
c574dbda
GXT
484 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| \"-p #{p}\"}.join(' ')"`
485
486 IFS='-p ' read -a array <<< "$ports"
487 for element in "${array[@]}"
488 do
489 IFS=':' read -a args <<< "$element"
490 if [ "${#args[@]}" == "2" ]; then
491 check_ports "${args[0]}"
492 elif [ "${#args[@]}" == "3" ]; then
493 check_ports "${args[1]}"
494 fi
495 done
30835a52 496
8b617e6e
PG
497 docker_args=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
498 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['docker_args']"`
499
30835a52
S
500 set_template_info
501 set_volumes
502 set_links
8877f99e
S
503 set_run_image
504 set_boot_command
30835a52 505
c6dd6f9d
FB
506 # get hostname and settings from container configuration
507 for envar in "${env[@]}"
508 do
509 if [[ $envar == DOCKER_USE_HOSTNAME* ]] || [[ $envar == DISCOURSE_HOSTNAME* ]]
510 then
511 # use as environment variable
512 eval $envar
513 fi
514 done
515
30835a52 516 (
c834fdd1 517 hostname=`hostname -s`
6938eaca
S
518 # we got to normalize so we only have allowed strings, this is more comprehensive but lets see how bash does first
519 # hostname=`$docker_path run $user_args --rm $image ruby -e 'print ARGV[0].gsub(/[^a-zA-Z-]/, "-")' $hostname`
520 # docker added more hostname rules
521 hostname=${hostname/_/-}
c6dd6f9d
FB
522 # overwrite hostname
523 if [ "$DOCKER_USE_HOSTNAME" = "true" ]
524 then
525 hostname=$DISCOURSE_HOSTNAME
526 else
527 hostname=$hostname-$config
528 fi
529
30835a52 530 set -x
c6dd6f9d 531 $docker_path run $user_args $links $attach_on_run $restart_policy "${env[@]}" -h "$hostname" \
8877f99e 532 -e DOCKER_HOST_IP=$docker_ip --name $config -t $ports $volumes $docker_args $run_image $boot_command
30835a52
S
533
534 )
535 exit 0
337a89aa
S
536
537}
538
680dd4ea 539run_bootstrap(){
60f9f04c 540
d3c57e14
S
541 if [ "$opt" != "--skip-prereqs" ] ; then
542 check_resources
543 fi
6e784be6 544
60f9f04c
S
545 host_run
546
680dd4ea 547 get_ssh_pub_key
88126eba 548
680dd4ea
S
549 # Is the image available?
550 # If not, pull it here so the user is aware what's happening.
4807b1b8 551 $docker_path history $image >/dev/null 2>&1 || $docker_path pull $image
88126eba 552
680dd4ea 553 set_template_info
93149421 554
e02c1511 555 base_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
680dd4ea 556 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
93149421 557
e02c1511 558 update_pups=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
680dd4ea 559 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
b9c7b50e 560
680dd4ea
S
561 if [[ ! X"" = X"$base_image" ]]; then
562 image=$base_image
563 fi
b9c7b50e 564
680dd4ea 565 set_volumes
41daa523 566 set_links
b9c7b50e 567
680dd4ea 568 rm -f $cidbootstrap
d90671f3 569
680dd4ea
S
570 run_command="cd /pups &&"
571 if [[ ! "false" = $update_pups ]]; then
572 run_command="$run_command git pull &&"
573 fi
574 run_command="$run_command /pups/bin/pups --stdin"
2162f1d4 575
680dd4ea 576 echo $run_command
b9c7b50e 577
680dd4ea 578 env=("${env[@]}" "-e" "SSH_PUB_KEY=$ssh_pub_key")
c4498636 579
e02c1511 580 (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 581 /bin/bash -c "$run_command") \
4807b1b8 582 || ($docker_path rm `cat $cidbootstrap` && rm $cidbootstrap)
88126eba 583
4b733d87 584 [ ! -e $cidbootstrap ] && echo "** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one" && exit 1
9fb5f2d3 585
680dd4ea 586 sleep 5
2162f1d4 587
4807b1b8
MB
588 $docker_path commit `cat $cidbootstrap` $local_discourse/$config || echo 'FAILED TO COMMIT'
589 $docker_path rm `cat $cidbootstrap` && rm $cidbootstrap
680dd4ea 590}
9fb5f2d3 591
8877f99e
S
592
593
680dd4ea
S
594case "$command" in
595 bootstrap)
680dd4ea 596 run_bootstrap
2dd2e330 597 echo "Successfully bootstrapped, to startup use ./launcher start $config"
4b3aebe1 598 exit 0
5f803fb4 599 ;;
1acce9e4 600
2fc6ff36 601 enter)
0c456e8c 602 exec $docker_path exec -it $config /bin/bash --login
2fc6ff36
S
603 ;;
604
5f803fb4 605 ssh)
295e8f19 606 existing=`$docker_path ps | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
30835a52
S
607
608 if [[ ! -z $existing ]]; then
609 address="`$docker_path port $config 22`"
610 split=(${address//:/ })
611 exec ssh -o StrictHostKeyChecking=no root@${split[0]} -p ${split[1]}
612 else
613 echo "$config is not running!"
614 exit 1
615 fi
5f803fb4 616 ;;
7e738616 617
5f803fb4 618 stop)
337a89aa
S
619 run_stop
620 exit 0
5f803fb4 621 ;;
7e738616 622
5f803fb4 623 logs)
7e738616 624
30835a52
S
625 $docker_path logs $config
626 exit 0
5f803fb4 627 ;;
7e738616 628
337a89aa
S
629 restart)
630 run_stop
631 run_start
632 exit 0
633 ;;
80c11be3 634
337a89aa
S
635 start)
636 run_start
637 exit 0
5f803fb4 638 ;;
7e738616 639
680dd4ea 640 rebuild)
4b6456ef 641 if [ "$(git symbolic-ref --short HEAD)" == "master" ]; then
098533cb
S
642 echo "Ensuring discourse docker is up to date"
643
644 git remote update
645
646 LOCAL=$(git rev-parse @)
647 REMOTE=$(git rev-parse @{u})
648 BASE=$(git merge-base @ @{u})
649
650 if [ $LOCAL = $REMOTE ]; then
651 echo "Discourse Docker is up-to-date"
652
653 elif [ $LOCAL = $BASE ]; then
654 echo "Updating Discourse Docker"
655 git pull || (echo 'failed to update' && exit 1)
656 exec /bin/bash $0 $@
657
658 elif [ $REMOTE = $BASE ]; then
659 echo "Your version of Discourse Docker is ahead of origin"
660
661 else
905ec302 662 echo "Discourse Docker has diverged source, this is only expected in Dev mode"
098533cb
S
663 fi
664
4b6456ef 665 fi
30835a52
S
666
667 set_existing_container
668
669 if [ ! -z $existing ]
680dd4ea
S
670 then
671 echo "Stopping old container"
30835a52
S
672 (
673 set -x
674 $docker_path stop -t 10 $config
675 )
680dd4ea
S
676 fi
677
678 run_bootstrap
679
30835a52 680 if [ ! -z $existing ]
680dd4ea 681 then
30835a52
S
682 echo "Removing old container"
683 (
684 set -x
685 $docker_path rm $config
686 )
680dd4ea
S
687 fi
688
689 run_start
690 exit 0
691 ;;
692
7e738616 693
5f803fb4 694 destroy)
30835a52
S
695 (set -x; $docker_path stop -t 10 $config && $docker_path rm $config) || (echo "$config was not found" && exit 0)
696 exit 0
5f803fb4
SS
697 ;;
698esac
7e738616 699
5f803fb4 700usage