}
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
}
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
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)
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
;;
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
;;
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