X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=launcher;h=d4aff1cffd777b395c37ac7dc285b03c51d9175d;hb=025a598b03d6fec4bddf6f0c890c9a0e3c034ead;hp=2a71164cc57fd65ac5b9054323a7a8904e07cb1d;hpb=7936ebaaed5ebe9606e0f4bab34e74afe7b4ceb6;p=discourse_docker.git diff --git a/launcher b/launcher index 2a71164..d4aff1c 100755 --- a/launcher +++ b/launcher @@ -6,12 +6,15 @@ opt=$3 cd "$(dirname "$0")" +docker_min_version='0.9.1' +docker_rec_version='0.11.1' + config_file=containers/"$config".yml cidfile=cids/"$config".cid cidbootstrap=cids/"$config"_boostrap.cid local_discourse=local_discourse -image=samsaffron/discourse:0.2.0 -docker_path=`which docker` +image=samsaffron/discourse:0.2.3 +docker_path=`which docker.io || which docker` docker_ip=`/sbin/ifconfig | \ grep -B1 "inet addr" | \ @@ -38,37 +41,64 @@ usage () { exit 1 } +compare_version() { + declare -a ver_a + declare -a ver_b + IFS=. read -a ver_a <<< "$1" + IFS=. read -a ver_b <<< "$2" + + while [[ -n $ver_a ]]; do + if (( ver_a > ver_b )); then + return 0 + elif (( ver_b > ver_a )); then + return 1 + else + unset ver_a[0] + ver_a=("${ver_a[@]}") + unset ver_b[0] + ver_b=("${ver_b[@]}") + fi + done + return 1 # They are equal +} + prereqs() { # 1. docker daemon running? - test=`docker info >/dev/null` + test=`$docker_path info >/dev/null` if [[ $? -ne 0 ]] ; then echo "Cannot connect to the docker daemon - verify it is running and you have access" exit 1 fi - # 2. running aufs - test=`docker info 2> /dev/null | grep 'Driver: aufs'` + # 2. running aufs + test=`$docker_path info 2> /dev/null | grep 'Driver: aufs'` if [[ "$test" =~ "aufs" ]] ; then : ; else - echo "Your Docker installation is not using aufs" - echo "Device mapper and other experimental drivers are unstable" - echo - echo "Please ensure your kernel is running linux extras and aufs" - echo "Please follow the installation guide for Docker here: http://docs.docker.io/en/latest/installation/ubuntulinux/" - exit 1 + echo "Your Docker installation is not using aufs, in the past we have had issues with it" + echo "If you are unable to bootstrap your image (or stop it) please report the issue at:" + echo "https://meta.discourse.org/t/discourse-docker-installation-without-aufs/15639" fi - # 3. running docker 0.10+ - test=`docker --version | grep 0.10` + # 3. running recommended docker version + test=($($docker_path --version)) # Get docker version string + test=${test[2]//,/} # Get version alone and strip comma if exists + + [[ "$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 - if [[ "$test" =~ "0.10" ]] ; then : ; else - echo "Your Docker installation is old, please upgrade to 0.10.0 or up" + # At least minimum version + if compare_version "${docker_min_version}" "${test}"; then + echo "ERROR: Docker version ${test} not supported, please upgrade to at least ${docker_min_version}, or recommended ${docker_rec_version}" exit 1 fi + # Recommend best version + if compare_version "${docker_rec_version}" "${test}"; then + echo "WARNING: Docker version ${test} deprecated, recommend upgrade to ${docker_rec_version} or newer." + fi + # 4. able to attach stderr / out / tty - test=`docker run -i --rm -a stdout -a stderr $image echo working` + test=`$docker_path run -i --rm -a stdout -a stderr $image echo working` if [[ "$test" =~ "working" ]] ; then : ; else echo "Your Docker installation is not working correctly" echo @@ -84,16 +114,16 @@ fi get_ssh_pub_key() { if tty -s ; then if [[ ! -e ~/.ssh/id_rsa.pub && ! -e ~/.ssh/id_dsa.pub ]] ; then - echo You have no SSH key associated to this profile - echo "(This will allow you ssh access into your container)" - read -p "Generate SSH key at ~/.ssh/id_rsa.pub? (y/N) " -n 1 -r - if [[ $REPLY =~ ^[Yy]$ ]] ; then + echo "This user has no SSH key, but a SSH key is required to access the Discourse Docker container." + read -p "Generate a SSH key? (Y/n) " -n 1 -r + if [[ $REPLY =~ ^[Nn]$ ]] ; then + echo + echo WARNING: You may not be able to log in to your container. echo - echo Generating SSH key - mkdir -p ~/.ssh && ssh-keygen -f ~/.ssh/id_rsa -t rsa -N '' else echo - echo WARNING: You may not be able to log in to your container. + echo Generating SSH key + mkdir -p ~/.ssh && ssh-keygen -f ~/.ssh/id_rsa -t rsa -N '' echo fi fi @@ -122,13 +152,13 @@ install_docker() { } set_volumes() { - volumes=`cat $config_file | docker run --rm -i -a stdout -a stdin $image ruby -e \ + volumes=`cat $config_file | $docker_path run --rm -i -a stdout -a stdin $image ruby -e \ "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"` } set_template_info() { - templates=`cat $config_file | docker run --rm -i -a stdin -a stdout $image ruby -e \ + templates=`cat $config_file | $docker_path run --rm -i -a stdin -a stdout $image ruby -e \ "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"` @@ -157,6 +187,9 @@ set_template_info() { yml.strip! begin env.merge!(YAML.load(yml)['env'] || {}) + rescue Psych::SyntaxError => e + puts e + puts "*ERROR." rescue => e puts yml p e @@ -165,13 +198,23 @@ set_template_info() { puts env.map{|k,v| "-e\n#{k}=#{v}" }.join("\n") RUBY - raw=`exec echo "$input" | docker run --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"` + raw=`exec echo "$input" | $docker_path run --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"` env=() + ok=1 while read i; do - env[${#env[@]}]=$i + if [ "$i" == "*ERROR." ]; then + ok=0 + elif [ -n "$i" ]; then + env[${#env[@]}]=$i + fi done <<< "$raw" + if [ "$ok" -ne 1 ]; then + echo "${env[@]}" + echo "YAML syntax error. Please check your configuration files." + exit 1 + fi echo "Calculated ENV: ${env[@]}" } @@ -187,6 +230,8 @@ RUBY if [ ! -e $config_file ] then echo "Config file was not found, ensure $config_file exists" + echo "" + echo "Available configs ( `cd containers && ls -dm *.yml | tr -s '\n' ' ' | awk '{ gsub(/\.yml/, ""); print }'`)" exit 1 fi @@ -205,7 +250,7 @@ run_stop(){ echo "No cid found" exit 1 else - docker stop -t 10 `cat $cidfile` + $docker_path stop -t 10 `cat $cidfile` fi } @@ -214,13 +259,13 @@ run_start(){ if [ ! -e $cidfile ] then echo "No cid found, creating a new container" - ports=`cat $config_file | docker run --rm -i -a stdout -a stdin $image ruby -e \ + ports=`cat $config_file | $docker_path run --rm -i -a stdout -a stdin $image ruby -e \ "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| '-p ' << p.to_s << ' '}.join"` set_template_info set_volumes - existing=`docker ps -a | awk '{ print $1, $(NF) }' | grep "$config$" | awk '{ print $1 }'` + existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep "$config$" | awk '{ print $1 }'` if [ ! -z $existing ] then echo "Found an existing container by its name, recovering cidfile, please rerun" @@ -228,8 +273,8 @@ run_start(){ exit 1 fi - docker run "${env[@]}" -h "`hostname`-$config" -e DOCKER_HOST_IP=$docker_ip --name $config -t --cidfile $cidfile $ports \ - -d $volumes $local_discourse/$config /usr/bin/runsvdir -P /etc/service + $docker_path run "${env[@]}" -h "`hostname`-$config" -e DOCKER_HOST_IP=$docker_ip --name $config -t --cidfile $cidfile $ports \ + -d $volumes $local_discourse/$config /sbin/runit exit 0 else @@ -242,7 +287,7 @@ run_start(){ exit 1 fi - found=`docker ps -q -a --no-trunc | grep $cid` + found=`$docker_path ps -q -a --no-trunc | grep $cid` if [ -z $found ] then echo "Invalid cid file, deleting, please re-run" @@ -251,7 +296,7 @@ run_start(){ fi echo "cid found, ensuring container is started" - docker start `cat $cidfile` + $docker_path start `cat $cidfile` exit 0 fi @@ -262,14 +307,14 @@ run_bootstrap(){ # Is the image available? # If not, pull it here so the user is aware what's happening. - docker history $image >/dev/null 2>&1 || docker pull $image + $docker_path history $image >/dev/null 2>&1 || $docker_path pull $image set_template_info - base_image=`cat $config_file | docker run --rm -i -a stdin -a stdout $image ruby -e \ + base_image=`cat $config_file | $docker_path run --rm -i -a stdin -a stdout $image ruby -e \ "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"` - update_pups=`cat $config_file | docker run --rm -i -a stdin -a stdout $image ruby -e \ + update_pups=`cat $config_file | $docker_path run --rm -i -a stdin -a stdout $image ruby -e \ "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"` if [[ ! X"" = X"$base_image" ]]; then @@ -290,16 +335,16 @@ run_bootstrap(){ env=("${env[@]}" "-e" "SSH_PUB_KEY=$ssh_pub_key") - (exec echo "$input" | docker run "${env[@]}" -e DOCKER_HOST_IP=$docker_ip --cidfile $cidbootstrap -i -a stdin -a stdout -a stderr $volumes $image \ + (exec echo "$input" | $docker_path run "${env[@]}" -e DOCKER_HOST_IP=$docker_ip --cidfile $cidbootstrap -i -a stdin -a stdout -a stderr $volumes $image \ /bin/bash -c "$run_command") \ - || (docker rm `cat $cidbootstrap` && rm $cidbootstrap) + || ($docker_path rm `cat $cidbootstrap` && rm $cidbootstrap) [ ! -e $cidbootstrap ] && echo "FAILED TO BOOTSTRAP" && exit 1 sleep 5 - docker commit `cat $cidbootstrap` $local_discourse/$config || echo 'FAILED TO COMMIT' - docker rm `cat $cidbootstrap` && rm $cidbootstrap + $docker_path commit `cat $cidbootstrap` $local_discourse/$config || echo 'FAILED TO COMMIT' + $docker_path rm `cat $cidbootstrap` && rm $cidbootstrap } case "$command" in @@ -321,7 +366,7 @@ case "$command" in exit 1 else cid="`cat $cidfile`" - address="`docker port $cid 22`" + address="`$docker_path port $cid 22`" split=(${address//:/ }) exec ssh -o StrictHostKeyChecking=no root@${split[0]} -p ${split[1]} fi @@ -339,7 +384,7 @@ case "$command" in echo "No cid found" exit 1 else - docker logs `cat $cidfile` + $docker_path logs `cat $cidfile` exit 0 fi ;; @@ -359,14 +404,14 @@ case "$command" in if [ -e $cidfile ] then echo "Stopping old container" - docker stop -t 10 `cat $cidfile` + $docker_path stop -t 10 `cat $cidfile` fi run_bootstrap if [ -e $cidfile ] then - docker rm `cat $cidfile` && rm $cidfile + $docker_path rm `cat $cidfile` && rm $cidfile fi run_start @@ -378,8 +423,8 @@ case "$command" in if [ -e $cidfile ] then echo "destroying container $cidfile" - docker stop -t 10 `cat $cidfile` - docker rm `cat $cidfile` && rm $cidfile + $docker_path stop -t 10 `cat $cidfile` + $docker_path rm `cat $cidfile` && rm $cidfile exit 0 else echo "nothing to destroy cidfile does not exist"