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