Created
October 20, 2016 09:57
-
-
Save Ratler/058f216a2d653595c287723a0066d801 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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