X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=launcher;h=4115d6bf258827fe9fd941295b4bd6b0e89efe62;hb=fcdd39da610f036f36e8f9e70bf0ca93ef95b23a;hp=6eb11687af4018038b58fef634bc797b56f653bd;hpb=19e3a6c0cbfff470ffb32de9967a6e91c751516a;p=discourse_docker.git diff --git a/launcher b/launcher index 6eb1168..4115d6b 100755 --- a/launcher +++ b/launcher @@ -7,7 +7,7 @@ usage () { echo " stop: Stop a running container" echo " restart: Restart a container" echo " destroy: Stop and remove a container" - echo " enter: Use nsenter to get a shell into a container" + echo " enter: Open a shell to run commands inside the container" echo " logs: View the Docker logs for a container" echo " bootstrap: Bootstrap a container for the config based on a template" echo " rebuild: Rebuild a container (destroy old, bootstrap, start new)" @@ -16,6 +16,7 @@ usage () { echo "Options:" echo " --skip-prereqs Don't check launcher prerequisites" echo " --docker-args Extra arguments to pass when running docker" + echo " --skip-mac-address Don't assign a mac address" exit 1 } @@ -29,7 +30,10 @@ while [ ${#} -gt 0 ]; do DEBUG="1" ;; --skip-prereqs) - SKIP_PREREQ="1" + SKIP_PREREQS="1" + ;; + --skip-mac-address) + SKIP_MAC_ADDRESS="1" ;; --docker-args) user_args="$2" @@ -52,15 +56,15 @@ fi cd "$(dirname "$0")" -docker_min_version='1.6.0' -docker_rec_version='1.6.0' +docker_min_version='1.8.0' +docker_rec_version='1.8.0' git_min_version='1.8.0' git_rec_version='1.8.0' config_file=containers/"$config".yml cidbootstrap=cids/"$config"_bootstrap.cid local_discourse=local_discourse -image=discourse/discourse:1.0.17 +image=discourse/discourse:1.3.10 docker_path=`which docker.io || which docker` git_path=`which git` @@ -129,15 +133,15 @@ check_prereqs() { exit 1 fi - # 2. running aufs or btrfs - test=`$docker_path info 2> /dev/null | grep 'Driver: '` - if [[ "$test" =~ [aufs|btrfs|zfs|overlay] ]] ; then : ; else - echo "Your Docker installation is not using a supported filesystem if we were to proceed you may have a broken install." - echo "aufs is the recommended filesystem you should be using (zfs/btrfs and overlay may work as well)" - echo "You can tell what filesystem you are using by running \"docker info\" and looking at the driver" + # 2. running an approved storage driver? + if ! $docker_path info 2> /dev/null | egrep -q '^Storage Driver: (aufs|btrfs|zfs|overlay|overlay2)$'; then + echo "Your Docker installation is not using a supported storage driver. If we were to proceed you may have a broken install." + echo "aufs is the recommended storage driver, although zfs/btrfs/overlay and overlay2 may work as well." + echo "Other storage drivers are known to be problematic." + echo "You can tell what filesystem you are using by running \"docker info\" and looking at the 'Storage Driver' line." echo - echo "If you wish to continue anyway using your existing unsupported filesystem, " - echo "read the source code of launcher and figure out how to bypass this." + echo "If you wish to continue anyway using your existing unsupported storage driver," + echo "read the source code of launcher and figure out how to bypass this check." exit 1 fi @@ -240,11 +244,31 @@ set_links() { "require 'yaml'; puts YAML.load(STDIN.readlines.join)['links'].map{|l| '--link ' << l['link']['name'] << ':' << l['link']['alias'] << ' '}.join"` } -set_template_info() { - - templates=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \ +find_templates() { + local templates=`cat $1 | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \ "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"` + local arrTemplates=${templates// / } + + if [ ! -z "$templates" ]; then + for template in "${arrTemplates[@]}" + do + local nested_templates=$(find_templates $template) + + if [ ! -z "$nested_templates" ]; then + templates="$templates $nested_templates" + fi + done + + echo $templates + else + echo "" + fi +} + +set_template_info() { + templates=$(find_templates $config_file) + arrTemplates=(${templates// / }) config_data=$(cat $config_file) @@ -298,6 +322,45 @@ RUBY echo "YAML syntax error. Please check your containers/*.yml config files." exit 1 fi + + read -r -d '' labels_ruby << 'RUBY' + require 'yaml' + + input=STDIN.readlines.join + # default to UTF-8 for the dbs sake + labels = {} + input.split('_FILE_SEPERATOR_').each do |yml| + yml.strip! + begin + labels.merge!(YAML.load(yml)['labels'] || {}) + rescue Psych::SyntaxError => e + puts e + puts "*ERROR." + rescue => e + puts yml + p e + end + end + puts labels.map{|k,v| "-l\n#{k}=#{v}" }.join("\n") +RUBY + + raw=`exec echo "$input" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$labels_ruby"` + + labels=() + ok=1 + while read i; do + if [ "$i" == "*ERROR." ]; then + ok=0 + elif [ -n "$i" ]; then + labels[${#labels[@]}]=$i + fi + done <<< "$raw" + + if [ "$ok" -ne 1 ]; then + echo "${labels[@]}" + echo "YAML syntax error. Please check your containers/*.yml config files." + exit 1 + fi } if [ -z $docker_path ]; then @@ -448,9 +511,15 @@ run_start() { # docker added more hostname rules hostname=${hostname//_/-} + + if [ -z "$SKIP_MAC_ADDRESS" ] ; then + 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/'")" + fi + set -x - $docker_path run $user_args $links $attach_on_run $restart_policy "${env[@]}" -h "$hostname" \ - -e DOCKER_HOST_IP=$docker_ip --name $config -t $ports $volumes $docker_args $run_image $boot_command + $docker_path run $links $attach_on_run $restart_policy "${env[@]}" "${labels[@]}" -h "$hostname" \ + -e DOCKER_HOST_IP="$docker_ip" --name $config -t $ports $volumes $mac_address $docker_args $user_args \ + $run_image $boot_command ) exit 0 @@ -492,9 +561,19 @@ run_bootstrap() { echo $run_command + unset ERR + (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 \ + /bin/bash -c "$run_command") || ERR=$? + unset FAILED - (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 \ - /bin/bash -c "$run_command") || FAILED="TRUE" + # magic exit code that indicates a retry + if [[ "$ERR" == 77 ]]; then + $docker_path rm `cat $cidbootstrap` + rm $cidbootstrap + exit 77 + elif [[ "$ERR" > 0 ]]; then + FAILED=TRUE + fi if [[ $FAILED = "TRUE" ]]; then if [[ ! -z "$DEBUG" ]]; then @@ -565,7 +644,12 @@ case "$command" in elif [ $LOCAL = $BASE ]; then echo "Updating Launcher" git pull || (echo 'failed to update' && exit 1) - exec /bin/bash $0 $@ + + for (( i=${#BASH_ARGV[@]}-1,j=0; i>=0,j<${#BASH_ARGV[@]}; i--,j++ )) + do + args[$j]=${BASH_ARGV[$i]} + done + exec /bin/bash $0 "${args[@]}" # $@ is empty, because of shift at the beginning. Use BASH_ARGV instead. elif [ $REMOTE = $BASE ]; then echo "Your version of Launcher is ahead of origin"