Skip to content

Instantly share code, notes, and snippets.

@Ratler
Created October 20, 2016 09:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Ratler/058f216a2d653595c287723a0066d801 to your computer and use it in GitHub Desktop.
Save Ratler/058f216a2d653595c287723a0066d801 to your computer and use it in GitHub Desktop.
#!/bin/bash
declare -a DEPENDENCIES
depends() {
local IMAGE DEPS
if [ $# -gt 1 ]; then
IMAGE=$1; shift
for dep in $@; do
if [ -z "$DEPS" ]; then
DEPS=$dep
else
DEPS+=" $dep"
fi
done
DEPENDENCIES+=("$IMAGE:$DEPS")
fi
export DEPENDENCIES
}
get_deps() {
local RECURSION IFS
RECURSION=${2:-0}
if [ "$RECURSION" -gt 20 ]; then
pperrmsg "MAX(20) dependency recursion reached, bailing out!"
exit 1
fi
IFS=$'\n'
for deps in ${DEPENDENCIES[@]}; do
if echo $deps | grep -q "^$1:"; then
IFS=$'\n '
for dep in $(echo $deps | cut -d: -f2-); do
echo $dep
get_deps $dep $((RECURSION+1))
done
IFS=$'\n '
fi
done
if [ $RECURSION -eq 0 ]; then
echo $1
fi
}
__pptool_docker() {
local image dargs tport TAILF B2D_STATUS ATTEMPT CONTAINER_ID CONTAINER_IP IP
DEPENDENCIES=""
. $PP_DIR/etc/docker_images
# Override docker args
if [ -f $PP_DIR/etc/docker_images_local ]; then
. $PP_DIR/etc/docker_images_local
fi
if [[ "$PP_PLATFORM" == "Darwin" ]]; then
if [[ "$BOOT2DOCKER" != "false" ]]; then
B2D_STATUS=$(boot2docker status)
if [[ "$B2D_STATUS" == "poweroff" ]]; then
if [[ "$1" == "stop" ]]; then
return
fi
boot2docker up
elif [[ "$B2D_STATUS" == "aborted" ]]; then
boot2docker down
if [[ "$1" == "stop" ]]; then
return
fi
boot2docker up
fi
elif [[ "$PP_VM_TYPE" == "prl" ]]; then
vagrant_up
fi
fi
docker_shellinit
do_sudo
case "$1" in
start)
if [ -n "$2" ]; then
if echo $PP_DOCKER_IMAGES | grep -q $2; then
PP_AUTO_RUN=$2
else
ppmsg "Unknown docker image: $2"
exit 1
fi
fi
# Check if a data volume exists or create one
# NOTE: This container may NEVER be removed or data will be lost
if ! ppdocker ps -a | grep -q 'pp-local-data'; then
ppdocker pull $PP_DOCKER_REGISTRY/pp-local-data
ppdocker run -v /data --name pp-local-data $PP_DOCKER_REGISTRY/pp-local-data
fi
RUN_IMAGES=$(for i in $PP_AUTO_RUN; do get_deps $i; done)
for image in $RUN_IMAGES; do
if ! ppdocker ps | grep -q "$PP_DOCKER_REGISTRY/$image "; then
eval dargs=\${docker_${image//-/_}_args}
eval tport=\${docker_${image//-/_}_port}
if [[ "$3" == "interactive" ]]; then
ppdocker run -t -i ${dargs:-$docker_default_args} $PP_DOCKER_REGISTRY/$image /bin/bash -l
else
if [[ "$PP_PLATFORM" == "Darwin" && "$BOOT2DOCKER" != "false" ]]; then
IP=$(boot2docker ip 2> /dev/null)
elif [ -n "$DOCKER_HOST" ]; then
IP=$(echo $DOCKER_HOST | sed -e 's-^.*://--;s-:.*--')
fi
CONTAINER_ID=$(ppdocker run -d ${dargs:-$docker_default_args} $PP_DOCKER_REGISTRY/$image $3)
CONTAINER_IP=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID)
msg="${PREFIX}${OK_COLOR}${OK_MSG}${DEFAULT_COLOR}${SUFFIX}"
if [ -n "$tport" ]; then
START_TIME=$(date +%s)
if [ -n "$SPINNER_CUSTOM" ]; then
TEMP=SPINNER_CUSTOM
else
TEMP=SPINNER_${SPINNER_NR:-6}
fi
eval SPINNER=( \"\${$TEMP[@]}\" )
until nc -z ${IP:-$CONTAINER_IP} $tport &> /dev/null; do
ELAPSED=$(($(date +%s) - $START_TIME))
((C++))
if [[ $C -gt $((${#SPINNER[@]} - 1)) ]]; then
C=0
fi
echo -en "\rStarting $image ${SPINNER[$C]} "
if [ $ELAPSED -gt ${START_TIMEOUT:-30} ]; then
msg="${PREFIX}${PROBLEM_COLOR}${FAILED_MSG}${DEFAULT_COLOR}${SUFFIX}\n\n"
error_log="$(ppdocker logs $CONTAINER_ID 2>&1)"
ppdocker kill $CONTAINER_ID &> /dev/null
break
fi
sleep 0.1
done
printf "\rStarting %s %b%-${#SPINNER[$C]}s\n" "$image" "$msg"
if [ -n "$error_log" ]; then
ppmsg "$error_log"
fi
else
sleep 5
ppdocker ps | grep -q "$PP_DOCKER_REGISTRY/$image " && ppmsg " [${OK_COLOR}${OK_MSG}${DEFAULT_COLOR}]" || ppmsg " [${PROBLEM_COLOR}${FAILED_MSG}${DEFAULT_COLOR}]"
fi
fi
fi
done
;;
stop)
PP_AUTO_RUN=$(ppdocker ps --filter status=running --format="{{.Image}}" | cut -d/ -f2)
if [ -n "$2" ]; then
PP_AUTO_RUN=$2
fi
for image in $PP_AUTO_RUN; do
if ppdocker ps | grep -q "/$image "; then
KILL_IMAGE="/$image "
elif [[ "$image" =~ ^[0-9A-Fa-f]{12}$ ]]; then # Stop containers without a valid parent image name
KILL_IMAGE="$image"
else
continue
fi
echo -n "Stopping $image..."
ppdocker kill $(ppdocker ps | grep "$KILL_IMAGE" | cut -d' ' -f1)
done
;;
logs)
STATUS_IMAGES=$(ppdocker images | grep -v 'pp-local-data' | awk "/${PP_DOCKER_REGISTRY:-registry-se.rnd.projectplace.com}/ { print \$1 }" | cut -d/ -f2)
if [[ "$2" =~ ^[0-9]+$ ]]; then
TAILF=$2
elif [ -n "$2" ]; then
STATUS_IMAGES=$2
fi
if [[ "$3" =~ ^[0-9]+$ ]]; then
TAILF=$3
fi
for image in $STATUS_IMAGES; do
CONTAINER=1
if ppdocker ps | grep -q "/$image "; then
ppmsg "\n--- Last ${TAILF:-5} log entries [${IMAGE_COLOR}$image${DEFAULT_COLOR}] ---"
ppdocker logs $(ppdocker ps | grep "/$image" | tail -1 | awk '{ print $1 }') 2>&1 | tail -${TAILF:-5}
ppmsg "--- End logs [${IMAGE_COLOR}$image${DEFAULT_COLOR}]---\n"
CONTAINER=0
fi
done
if [ "$CONTAINER" -eq 1 ]; then
ppmsg "No containers running"
fi
;;
status)
if [ -n "$2" ]; then
STATUS_IMAGES=$2
else
STATUS_IMAGES=$(ppdocker images | grep -Ev '(pp-local-data|<none>)' | awk "/${PP_DOCKER_REGISTRY:-registry-se.rnd.projectplace.com}/ { print \$1 }" | cut -d/ -f2)
fi
for image in $STATUS_IMAGES; do
if ppdocker ps | grep -q "/$image "; then
ppmsg "${PREFIX}${OK_COLOR}${RUNNING_MSG}${DEFAULT_COLOR}${SUFFIX} $image"
else
ppmsg "${PREFIX}${PROBLEM_COLOR}${STOPPED_MSG}${DEFAULT_COLOR}${SUFFIX} $image"
fi
done
;;
ps)
shift 2
ppdocker ps $@
;;
commit)
shift 2
COMMIT_ID=$(ppdocker ps -aq -f status=exited | head -1)
IMAGE_TAG=$(ppdocker ps -a | grep ^${COMMIT_ID} | awk '{ print $2 }')
echo -n "This operation will overwrite the image $IMAGE_TAG with container id $COMMIT_ID, continue (y/N)? "
read ANS
if [[ "$ANS" == "y" || "$ANS" == "Y" ]]; then
ppdocker commit $COMMIT_ID $IMAGE_TAG
else
echo "Not committing the changes."
fi
;;
restart)
shift
__pptool_docker stop $@
__pptool_docker start $@
;;
esac
}
docker_shellinit() {
if [[ "$PP_PLATFORM" == "Darwin" ]]; then
if [[ "$BOOT2DOCKER" != "false" ]]; then
if [[ -z "$DOCKER_HOST" ]]; then
eval $(boot2docker shellinit 2> /dev/null)
fi
elif [[ "$PP_VM_TYPE" == "prl" ]]; then
export DOCKER_HOST="tcp://192.168.59.100:2376"
fi
fi
}
docker_fetch_cleanup() {
. $PP_DIR/etc/docker_images
ppmsg "Updating existing docker images..."
for image in $(ppdocker images | grep -v 'pp-local-data' | awk "/${PP_DOCKER_REGISTRY:-registry-se.rnd.projectplace.com}/ { print \$1 }"); do
ppdocker pull $image
done
ppmsg "Cleaning up rogue docker images..."
for image in $(ppdocker ps -a -f status=exited -f status=dead | grep -v 'pp-local-data' | awk '/^[a-f0-9]{12}/ { print $1 }'); do
ppdocker rm $image
done
for image in $(ppdocker images | awk '/<none>/ { print $3 }'); do
ppdocker rmi $image
done
}
ppdocker() {
$DO_SUDO docker $DOCKER_ARGS $@
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment