fix deprecations
[discourse_docker.git] / launcher
index a719d259e6564a867adfaefde6232c1301a8d6dd..4e91a8ec42cd90523980d7c029f482b95430d681 100755 (executable)
--- a/launcher
+++ b/launcher
@@ -48,10 +48,59 @@ install_docker() {
 }
 
 set_volumes() {
-  volumes=`cat $config_file | docker run -rm -i -a stdout -a stdin $image ruby -e \
+  volumes=`cat $config_file | docker 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 \
+      "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
+
+
+    arrTemplates=(${templates// / })
+    config_data=$(cat $config_file)
+
+    input="hack: true"
+
+
+    for template in "${arrTemplates[@]}"
+    do
+      [ ! -z $template ] && {
+        input="$input _FILE_SEPERATOR_ $(cat $template)"
+      }
+    done
+
+    # we always want our config file last so it takes priority
+    input="$input _FILE_SEPERATOR_ $config_data"
+
+    read -r -d '' env_ruby << 'RUBY'
+    require 'yaml'
+
+    input=STDIN.readlines.join
+    env = {}
+    input.split('_FILE_SEPERATOR_').each do |yml|
+       yml.strip!
+       begin
+         env.merge!(YAML.load(yml)['env'] || {})
+       rescue => e
+        puts yml
+        p e
+       end
+    end
+    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"`
+
+    env=()
+    while read i; do
+      env[${#env[@]}]=$i
+    done <<< "$raw"
+
+    echo "Calculated ENV: ${env[@]}"
+}
+
 [ -z $docker_path ] && {
   install_docker
 }
@@ -69,34 +118,22 @@ fi
 
 case "$command" in
   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
 
-      templates=`cat $config_file | docker run -rm -i -a stdin -a stdout $image ruby -e \
-        "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
+      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 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 run --rm -i -a stdin -a stdout $image ruby -e \
         "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
 
-      arrTemplates=(${templates// / })
-      config_data=$(cat $config_file)
-      input="hack: true"
-
       if [[ ! X"" = X"$base_image" ]]; then
         image=$base_image
       fi
 
-      for template in "${arrTemplates[@]}"
-      do
-        [ ! -z $template ] && {
-          input="$input _FILE_SEPERATOR_ $(cat $template)"
-        }
-      done
-
-      # we always want our config file last so it takes priority
-      input="$input _FILE_SEPERATOR_ $config_data"
-
       set_volumes
 
       rm -f $cidbootstrap
@@ -107,7 +144,9 @@ case "$command" in
       fi
       run_command="$run_command /pups/bin/pups --stdin"
 
-      (exec echo "$input" | docker run -e DOCKER_HOST_IP=$docker_ip -cidfile $cidbootstrap -i -a stdin -a stdout -a stderr $volumes $image \
+      echo $run_command
+
+      (exec echo "$input" | docker 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)
 
@@ -118,7 +157,7 @@ case "$command" in
       docker commit `cat $cidbootstrap` $local_discourse/$config || echo 'FAILED TO COMMIT'
       docker rm `cat $cidbootstrap` && rm $cidbootstrap
 
-      echo "Successfully bootstrappd, to starup use ./launcher start $config"
+      echo "Successfully bootstrapped, to startup use ./launcher start $config"
       exit 0
       ;;
 
@@ -131,7 +170,7 @@ case "$command" in
            cid="`cat $cidfile`"
            address="`docker port $cid 22`"
            split=(${address//:/ })
-           exec ssh root@${split[0]} -p ${split[1]}
+           exec ssh -o StrictHostKeyChecking=no root@${split[0]} -p ${split[1]}
       fi
       ;;
 
@@ -163,16 +202,42 @@ case "$command" in
       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 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
 
-           docker run -e DOCKER_HOST_IP=$docker_ip -name $config -cidfile $cidfile $ports \
+           existing=`docker 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"
+             echo $existing > $cidfile
+             exit 1
+           fi
+
+           docker run "${env[@]}" -h "`hostname`-$config" -e DOCKER_HOST_IP=$docker_ip -name $config --cidfile $cidfile $ports \
                       -d $volumes $local_discourse/$config /usr/bin/runsvdir -P /etc/service
 
            exit 0
          else
+           cid=`cat $cidfile`
+
+           if [ -z $cid ]
+           then
+             echo "Detected empty cid file, deleting, please re-run"
+             rm $cidfile
+             exit 1
+           fi
+
+           found=`docker ps -q -a -notrunc | grep $cid`
+           if [ -z $found ]
+           then
+             echo "Invalid cid file, deleting, please re-run"
+             rm $cidfile
+             exit 1
+           fi
+
            echo "cid found, ensuring container is started"
            docker start `cat $cidfile`
            exit 0