X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=launcher;h=4e91a8ec42cd90523980d7c029f482b95430d681;hb=c44986364e432d08acdaee8ea70239bef61cf52a;hp=a719d259e6564a867adfaefde6232c1301a8d6dd;hpb=b9c7b50e7e833bb863cab04a0c8a7b205d0d8006;p=discourse_docker.git diff --git a/launcher b/launcher index a719d25..4e91a8e 100755 --- 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