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