From 56b89ad07a448363c4fa79f286240b41064a94b7 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 7 Feb 2018 15:15:47 -0700 Subject: [PATCH 01/25] feat: implement run command in scheduler-docker-local plugin --- plugins/00_dokku-standard/subcommands/run | 43 ++------------- plugins/scheduler-docker-local/plugin.toml | 4 ++ plugins/scheduler-docker-local/scheduler-run | 57 ++++++++++++++++++++ 3 files changed, 64 insertions(+), 40 deletions(-) create mode 100644 plugins/scheduler-docker-local/plugin.toml create mode 100755 plugins/scheduler-docker-local/scheduler-run diff --git a/plugins/00_dokku-standard/subcommands/run b/plugins/00_dokku-standard/subcommands/run index a0dc3cbd2..8041be46c 100755 --- a/plugins/00_dokku-standard/subcommands/run +++ b/plugins/00_dokku-standard/subcommands/run @@ -1,53 +1,16 @@ #!/usr/bin/env bash set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" -source "$PLUGIN_AVAILABLE_PATH/ps/functions" source "$PLUGIN_AVAILABLE_PATH/config/functions" dokku_run_cmd() { declare desc="runs command in container based on app image" - local cmd="run" - [[ -z $2 ]] && dokku_log_fail "Please specify an app to run the command on" - local APP="$2"; local IMAGE_TAG=$(get_running_image_tag "$APP"); local IMAGE=$(get_deploying_app_image_name "$APP" "$IMAGE_TAG") + declare cmd="run" APP="$2" verify_app_name "$APP" - shift 2 - if [[ -z "$DOKKU_RM_CONTAINER" ]]; then - local DOKKU_APP_RM_CONTAINER=$(config_get "$APP" DOKKU_RM_CONTAINER || true) - local DOKKU_GLOBAL_RM_CONTAINER=$(config_get --global DOKKU_RM_CONTAINER || true) - local DOKKU_RM_CONTAINER=${DOKKU_APP_RM_CONTAINER:="$DOKKU_GLOBAL_RM_CONTAINER"} - fi - - local DOCKER_ARGS=$(: | plugn trigger docker-args-run "$APP" "$IMAGE_TAG") - [[ "$DOKKU_TRACE" ]] && local DOCKER_ARGS+=" -e TRACE=true " - - declare -a ARG_ARRAY - eval "ARG_ARRAY=($DOCKER_ARGS)" - - local DOKKU_RUN_OPTS=" -e DYNO=run.$RANDOM" - if [[ "$DOKKU_RM_CONTAINER" ]]; then - DOKKU_RUN_OPTS+=" --rm" - elif [[ "$DOKKU_DETACH_CONTAINER" ]]; then - DOKKU_RUN_OPTS+=" --detach" - fi - - has_tty && DOKKU_RUN_OPTS+=" -i -t" - is_image_herokuish_based "$IMAGE" && local EXEC_CMD="/exec" - - DOKKU_QUIET_OUTPUT=1 extract_procfile "$APP" - - POTENTIAL_PROCFILE_KEY="$1" - PROC_CMD=$(get_cmd_from_procfile "$APP" "$POTENTIAL_PROCFILE_KEY" || echo '') - remove_procfile "$APP" - - if [ ! -z "$PROC_CMD" ]; then - dokku_log_info1 "Found '$POTENTIAL_PROCFILE_KEY' in Procfile, running that command" - set -- "$PROC_CMD" "${@:2}" - fi - - # shellcheck disable=SC2086 - docker run $DOKKU_GLOBAL_RUN_ARGS $DOKKU_RUN_OPTS "${ARG_ARRAY[@]}" $IMAGE $EXEC_CMD "$@" + local DOKKU_SCHEDULER=$(config_get "$APP" DOKKU_SCHEDULER || echo "docker-local") + plugn trigger scheduler-run "$DOKKU_SCHEDULER" "$APP" "$@" } dokku_run_cmd "$@" diff --git a/plugins/scheduler-docker-local/plugin.toml b/plugins/scheduler-docker-local/plugin.toml new file mode 100644 index 000000000..a62860db6 --- /dev/null +++ b/plugins/scheduler-docker-local/plugin.toml @@ -0,0 +1,4 @@ +[plugin] +description = "dokku core scheduler-docker-local plugin" +version = "0.11.3" +[plugin.config] diff --git a/plugins/scheduler-docker-local/scheduler-run b/plugins/scheduler-docker-local/scheduler-run new file mode 100755 index 000000000..de53d95db --- /dev/null +++ b/plugins/scheduler-docker-local/scheduler-run @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" +source "$PLUGIN_AVAILABLE_PATH/ps/functions" +source "$PLUGIN_AVAILABLE_PATH/config/functions" + +scheduler-docker-local-scheduler-run() { + declare desc="runs command in container based on app image" + declare trigger="scheduler-docker-local scheduler-run" + declare DOKKU_SCHEDULER="$1" APP="$2" + shift 2 + + if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then + return + fi + + local IMAGE_TAG=$(get_running_image_tag "$APP") + local IMAGE=$(get_deploying_app_image_name "$APP" "$IMAGE_TAG") + + if [[ -z "$DOKKU_RM_CONTAINER" ]]; then + local DOKKU_APP_RM_CONTAINER=$(config_get "$APP" DOKKU_RM_CONTAINER || true) + local DOKKU_GLOBAL_RM_CONTAINER=$(config_get --global DOKKU_RM_CONTAINER || true) + local DOKKU_RM_CONTAINER=${DOKKU_APP_RM_CONTAINER:="$DOKKU_GLOBAL_RM_CONTAINER"} + fi + + local DOCKER_ARGS=$(: | plugn trigger docker-args-run "$APP" "$IMAGE_TAG") + [[ "$DOKKU_TRACE" ]] && local DOCKER_ARGS+=" -e TRACE=true " + + declare -a ARG_ARRAY + eval "ARG_ARRAY=($DOCKER_ARGS)" + + local DOKKU_RUN_OPTS=" -e DYNO=run.$RANDOM" + if [[ "$DOKKU_RM_CONTAINER" ]]; then + DOKKU_RUN_OPTS+=" --rm" + elif [[ "$DOKKU_DETACH_CONTAINER" ]]; then + DOKKU_RUN_OPTS+=" --detach" + fi + + has_tty && DOKKU_RUN_OPTS+=" -i -t" + is_image_herokuish_based "$IMAGE" && local EXEC_CMD="/exec" + + DOKKU_QUIET_OUTPUT=1 extract_procfile "$APP" + + POTENTIAL_PROCFILE_KEY="$1" + PROC_CMD=$(get_cmd_from_procfile "$APP" "$POTENTIAL_PROCFILE_KEY" || echo '') + remove_procfile "$APP" + + if [ ! -z "$PROC_CMD" ]; then + dokku_log_info1 "Found '$POTENTIAL_PROCFILE_KEY' in Procfile, running that command" + set -- "$PROC_CMD" "${@:2}" + fi + + # shellcheck disable=SC2086 + docker run $DOKKU_GLOBAL_RUN_ARGS $DOKKU_RUN_OPTS "${ARG_ARRAY[@]}" $IMAGE $EXEC_CMD "$@" +} + +scheduler-docker-local-scheduler-run "$@" From 5cada188d4bc726e74273ffcf3c4e2f0b2471ac6 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 7 Feb 2018 15:41:59 -0700 Subject: [PATCH 02/25] feat: move deploy logic into scheduler-docker-local plugin --- plugins/common/functions | 166 +---------------- .../scheduler-docker-local/scheduler-deploy | 175 ++++++++++++++++++ 2 files changed, 178 insertions(+), 163 deletions(-) create mode 100644 plugins/scheduler-docker-local/scheduler-deploy diff --git a/plugins/common/functions b/plugins/common/functions index bd45a886b..45bbb4544 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -542,170 +542,10 @@ dokku_release() { dokku_deploy_cmd() { declare desc="deploy phase" - local cmd="deploy" - source "$PLUGIN_AVAILABLE_PATH/checks/functions" - source "$PLUGIN_AVAILABLE_PATH/config/functions" + declare APP="$1" IMAGE_TAG="$2" - [[ -z $1 ]] && dokku_log_fail "Please specify an app to run the command on" - local APP="$1" IMAGE_TAG="$2" - local DOKKU_DOCKER_STOP_TIMEOUT DOKKU_HEROKUISH DOKKU_NETWORK_BIND_ALL IMAGE - DOKKU_HEROKUISH=false - IMAGE=$(get_deploying_app_image_name "$APP" "$IMAGE_TAG") - verify_app_name "$APP" - plugn trigger pre-deploy "$APP" "$IMAGE_TAG" - - is_image_herokuish_based "$IMAGE" && DOKKU_HEROKUISH=true - local DOKKU_SCALE_FILE="$DOKKU_ROOT/$APP/DOKKU_SCALE" - local oldids=$(get_app_container_ids "$APP") - - DOKKU_NETWORK_BIND_ALL="$(plugn trigger network-get-property "$APP" bind-all-interfaces)" - DOKKU_DOCKER_STOP_TIMEOUT="$(config_get "$APP" DOKKU_DOCKER_STOP_TIMEOUT || true)" - [[ $DOKKU_DOCKER_STOP_TIMEOUT ]] && DOCKER_STOP_TIME_ARG="--time=${DOKKU_DOCKER_STOP_TIMEOUT}" - - local line; local PROC_TYPE; local PROC_COUNT; local CONTAINER_INDEX - while read -r line || [[ -n "$line" ]]; do - [[ "$line" =~ ^#.* ]] && continue - line="$(strip_inline_comments "$line")" - PROC_TYPE=${line%%=*} - PROC_COUNT=${line#*=} - CONTAINER_INDEX=1 - - if [[ "$(is_app_proctype_checks_disabled "$APP" "$PROC_TYPE")" == "true" ]]; then - dokku_log_info1 "zero downtime is disabled for app ($APP.$PROC_TYPE). stopping currently running containers" - local cid proctype_oldids="$(get_app_running_container_ids "$APP" "$PROC_TYPE")" - for cid in $proctype_oldids; do - dokku_log_info2 "stopping $APP.$PROC_TYPE ($cid)" - # shellcheck disable=SC2086 - docker stop $DOCKER_STOP_TIME_ARG "$cid" &> /dev/null - # remove cid from oldids to skip the old container finish processing - oldids="$(remove_val_from_list "$cid" "$oldids" " ")" - done - fi - - while [[ $CONTAINER_INDEX -le $PROC_COUNT ]]; do - local cid=""; local port=""; local ipaddr="" - local DOKKU_CONTAINER_ID_FILE="$DOKKU_ROOT/$APP/CONTAINER.$PROC_TYPE.$CONTAINER_INDEX" - - # start the app - local DOCKER_ARGS - DOCKER_ARGS=$(: | plugn trigger docker-args-deploy "$APP" "$IMAGE_TAG" "$PROC_TYPE" "$CONTAINER_INDEX") - DOCKER_ARGS+=" -e DYNO=$PROC_TYPE.$CONTAINER_INDEX " - [[ "$DOKKU_TRACE" ]] && DOCKER_ARGS+=" -e TRACE=true " - - declare -a ARG_ARRAY - eval "ARG_ARRAY=($DOCKER_ARGS)" - - [[ "$DOKKU_HEROKUISH" == "true" ]] && local START_CMD="/start $PROC_TYPE" - - if [[ "$DOKKU_HEROKUISH" == "false" ]]; then - local DOKKU_DOCKERFILE_START_CMD=$(config_get "$APP" DOKKU_DOCKERFILE_START_CMD || true) - local DOKKU_PROCFILE_START_CMD=$(get_cmd_from_procfile "$APP" "$PROC_TYPE") - local START_CMD=${DOKKU_DOCKERFILE_START_CMD:-$DOKKU_PROCFILE_START_CMD} - fi - - if [[ "$PROC_TYPE" == "web" ]]; then - ports=($(plugn trigger network-compute-ports "$APP" "$PROC_TYPE" "$DOKKU_HEROKUISH")) - local DOKKU_DOCKER_PORT_ARGS="" - local DOKKU_PORT="" - for p in "${ports[@]}"; do - if [[ ! "$p" =~ .*udp.* ]]; then - DOKKU_PORT=${DOKKU_PORT:="$p"} - fi - DOKKU_DOCKER_PORT_ARGS+=" -p $p " - done - - if [[ "$DOKKU_NETWORK_BIND_ALL" == "false" ]]; then - # shellcheck disable=SC2086 - cid=$(docker run $DOKKU_GLOBAL_RUN_ARGS -d -e PORT=$DOKKU_PORT "${ARG_ARRAY[@]}" $IMAGE $START_CMD) - else - # shellcheck disable=SC2086 - cid=$(docker run $DOKKU_GLOBAL_RUN_ARGS -d $DOKKU_DOCKER_PORT_ARGS -e PORT=$DOKKU_PORT "${ARG_ARRAY[@]}" $IMAGE $START_CMD) - fi - else - # shellcheck disable=SC2086 - cid=$(docker run $DOKKU_GLOBAL_RUN_ARGS -d "${ARG_ARRAY[@]}" $IMAGE $START_CMD) - fi - - ipaddr=$(plugn trigger network-get-ipaddr "$APP" "$PROC_TYPE" "$cid") - port=$(plugn trigger network-get-port "$APP" "$PROC_TYPE" "$DOKKU_HEROKUISH" "$cid") - - kill_new() { - declare desc="wrapper function to kill newly started app container" - local cid="$1" - docker inspect "$cid" &> /dev/null && docker stop "$cid" > /dev/null && docker kill "$cid" &> /dev/null - trap - INT TERM EXIT - kill -9 $$ - } - - # run checks first, then post-deploy hooks, which switches proxy traffic - trap 'kill_new $cid' INT TERM EXIT - if [[ "$(is_app_proctype_checks_disabled "$APP" "$PROC_TYPE")" == "false" ]]; then - dokku_log_info1 "Attempting pre-flight checks" - plugn trigger check-deploy "$APP" "$cid" "$PROC_TYPE" "$port" "$ipaddr" - fi - trap - INT TERM EXIT - - # now using the new container - [[ -n "$cid" ]] && echo "$cid" > "$DOKKU_CONTAINER_ID_FILE" - [[ -n "$ipaddr" ]] && plugn trigger network-write-ipaddr "$APP" "$PROC_TYPE" "$CONTAINER_INDEX" "$ipaddr" - [[ -n "$port" ]] && plugn trigger network-write-port "$APP" "$PROC_TYPE" "$CONTAINER_INDEX" "$port" - - # cleanup pre-migration files - rm -f "$DOKKU_ROOT/$APP/CONTAINER" "$DOKKU_ROOT/$APP/IP" "$DOKKU_ROOT/$APP/PORT" - - local CONTAINER_INDEX=$(( CONTAINER_INDEX + 1 )) - done - # cleanup when we scale down - if [[ "$PROC_COUNT" == 0 ]]; then - local CONTAINER_IDX_OFFSET=0 - else - local CONTAINER_IDX_OFFSET=$((PROC_COUNT + 1)) - fi - local container_state_filetype - for container_state_filetype in CONTAINER IP PORT; do - cd "$DOKKU_ROOT/$APP" - find . -maxdepth 1 -name "$container_state_filetype.$PROC_TYPE.*" -printf "%f\n" | sort -t . -k 3 -n | tail -n +$CONTAINER_IDX_OFFSET | xargs rm -f - done - done < "$DOKKU_SCALE_FILE" - - dokku_log_info1 "Running post-deploy" - plugn trigger core-post-deploy "$APP" "$port" "$ipaddr" "$IMAGE_TAG" - plugn trigger post-deploy "$APP" "$port" "$ipaddr" "$IMAGE_TAG" - - # kill the old container - if [[ -n "$oldids" ]]; then - - if [[ -z "$DOKKU_WAIT_TO_RETIRE" ]]; then - local DOKKU_APP_DOKKU_WAIT_TO_RETIRE=$(config_get "$APP" DOKKU_WAIT_TO_RETIRE || true) - local DOKKU_GLOBAL_DOKKU_WAIT_TO_RETIRE=$(config_get --global DOKKU_WAIT_TO_RETIRE || true) - local DOKKU_WAIT_TO_RETIRE=${DOKKU_APP_DOKKU_WAIT_TO_RETIRE:="$DOKKU_GLOBAL_DOKKU_WAIT_TO_RETIRE"} - fi - - # Let the old container finish processing requests, before terminating it - local WAIT="${DOKKU_WAIT_TO_RETIRE:-60}" - dokku_log_info1 "Shutting down old containers in $WAIT seconds" - local oldid - for oldid in $oldids; do - dokku_log_info2 "$oldid" - done - ( - exec >/dev/null 2>/dev/null /dev/null + # remove cid from oldids to skip the old container finish processing + oldids="$(remove_val_from_list "$cid" "$oldids" " ")" + done + fi + + while [[ $CONTAINER_INDEX -le $PROC_COUNT ]]; do + local cid=""; local port=""; local ipaddr="" + local DOKKU_CONTAINER_ID_FILE="$DOKKU_ROOT/$APP/CONTAINER.$PROC_TYPE.$CONTAINER_INDEX" + + # start the app + local DOCKER_ARGS + DOCKER_ARGS=$(: | plugn trigger docker-args-deploy "$APP" "$IMAGE_TAG" "$PROC_TYPE" "$CONTAINER_INDEX") + DOCKER_ARGS+=" -e DYNO=$PROC_TYPE.$CONTAINER_INDEX " + [[ "$DOKKU_TRACE" ]] && DOCKER_ARGS+=" -e TRACE=true " + + declare -a ARG_ARRAY + eval "ARG_ARRAY=($DOCKER_ARGS)" + + [[ "$DOKKU_HEROKUISH" == "true" ]] && local START_CMD="/start $PROC_TYPE" + + if [[ "$DOKKU_HEROKUISH" == "false" ]]; then + local DOKKU_DOCKERFILE_START_CMD=$(config_get "$APP" DOKKU_DOCKERFILE_START_CMD || true) + local DOKKU_PROCFILE_START_CMD=$(get_cmd_from_procfile "$APP" "$PROC_TYPE") + local START_CMD=${DOKKU_DOCKERFILE_START_CMD:-$DOKKU_PROCFILE_START_CMD} + fi + + if [[ "$PROC_TYPE" == "web" ]]; then + ports=($(plugn trigger network-compute-ports "$APP" "$PROC_TYPE" "$DOKKU_HEROKUISH")) + local DOKKU_DOCKER_PORT_ARGS="" + local DOKKU_PORT="" + for p in "${ports[@]}"; do + if [[ ! "$p" =~ .*udp.* ]]; then + DOKKU_PORT=${DOKKU_PORT:="$p"} + fi + DOKKU_DOCKER_PORT_ARGS+=" -p $p " + done + + if [[ "$DOKKU_NETWORK_BIND_ALL" == "false" ]]; then + # shellcheck disable=SC2086 + cid=$(docker run $DOKKU_GLOBAL_RUN_ARGS -d -e PORT=$DOKKU_PORT "${ARG_ARRAY[@]}" $IMAGE $START_CMD) + else + # shellcheck disable=SC2086 + cid=$(docker run $DOKKU_GLOBAL_RUN_ARGS -d $DOKKU_DOCKER_PORT_ARGS -e PORT=$DOKKU_PORT "${ARG_ARRAY[@]}" $IMAGE $START_CMD) + fi + else + # shellcheck disable=SC2086 + cid=$(docker run $DOKKU_GLOBAL_RUN_ARGS -d "${ARG_ARRAY[@]}" $IMAGE $START_CMD) + fi + + ipaddr=$(plugn trigger network-get-ipaddr "$APP" "$PROC_TYPE" "$cid") + port=$(plugn trigger network-get-port "$APP" "$PROC_TYPE" "$DOKKU_HEROKUISH" "$cid") + + kill_new() { + declare desc="wrapper function to kill newly started app container" + local cid="$1" + docker inspect "$cid" &> /dev/null && docker stop "$cid" > /dev/null && docker kill "$cid" &> /dev/null + trap - INT TERM EXIT + kill -9 $$ + } + + # run checks first, then post-deploy hooks, which switches proxy traffic + trap 'kill_new $cid' INT TERM EXIT + if [[ "$(is_app_proctype_checks_disabled "$APP" "$PROC_TYPE")" == "false" ]]; then + dokku_log_info1 "Attempting pre-flight checks" + plugn trigger check-deploy "$APP" "$cid" "$PROC_TYPE" "$port" "$ipaddr" + fi + trap - INT TERM EXIT + + # now using the new container + [[ -n "$cid" ]] && echo "$cid" > "$DOKKU_CONTAINER_ID_FILE" + [[ -n "$ipaddr" ]] && plugn trigger network-write-ipaddr "$APP" "$PROC_TYPE" "$CONTAINER_INDEX" "$ipaddr" + [[ -n "$port" ]] && plugn trigger network-write-port "$APP" "$PROC_TYPE" "$CONTAINER_INDEX" "$port" + + # cleanup pre-migration files + rm -f "$DOKKU_ROOT/$APP/CONTAINER" "$DOKKU_ROOT/$APP/IP" "$DOKKU_ROOT/$APP/PORT" + + local CONTAINER_INDEX=$(( CONTAINER_INDEX + 1 )) + done + # cleanup when we scale down + if [[ "$PROC_COUNT" == 0 ]]; then + local CONTAINER_IDX_OFFSET=0 + else + local CONTAINER_IDX_OFFSET=$((PROC_COUNT + 1)) + fi + local container_state_filetype + for container_state_filetype in CONTAINER IP PORT; do + cd "$DOKKU_ROOT/$APP" + find . -maxdepth 1 -name "$container_state_filetype.$PROC_TYPE.*" -printf "%f\n" | sort -t . -k 3 -n | tail -n +$CONTAINER_IDX_OFFSET | xargs rm -f + done + done < "$DOKKU_SCALE_FILE" + + dokku_log_info1 "Running post-deploy" + plugn trigger core-post-deploy "$APP" "$port" "$ipaddr" "$IMAGE_TAG" + plugn trigger post-deploy "$APP" "$port" "$ipaddr" "$IMAGE_TAG" + + # kill the old container + if [[ -n "$oldids" ]]; then + + if [[ -z "$DOKKU_WAIT_TO_RETIRE" ]]; then + local DOKKU_APP_DOKKU_WAIT_TO_RETIRE=$(config_get "$APP" DOKKU_WAIT_TO_RETIRE || true) + local DOKKU_GLOBAL_DOKKU_WAIT_TO_RETIRE=$(config_get --global DOKKU_WAIT_TO_RETIRE || true) + local DOKKU_WAIT_TO_RETIRE=${DOKKU_APP_DOKKU_WAIT_TO_RETIRE:="$DOKKU_GLOBAL_DOKKU_WAIT_TO_RETIRE"} + fi + + # Let the old container finish processing requests, before terminating it + local WAIT="${DOKKU_WAIT_TO_RETIRE:-60}" + dokku_log_info1 "Shutting down old containers in $WAIT seconds" + local oldid + for oldid in $oldids; do + dokku_log_info2 "$oldid" + done + ( + exec >/dev/null 2>/dev/null Date: Wed, 7 Feb 2018 16:25:58 -0700 Subject: [PATCH 03/25] fix: trigger must be executable --- plugins/scheduler-docker-local/scheduler-deploy | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 plugins/scheduler-docker-local/scheduler-deploy diff --git a/plugins/scheduler-docker-local/scheduler-deploy b/plugins/scheduler-docker-local/scheduler-deploy old mode 100644 new mode 100755 From 50a98db8e66494cc4d09ca1a069eeac8fc3f3bac Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 7 Feb 2018 16:48:56 -0700 Subject: [PATCH 04/25] refactor: move container file cleanup/renames to scheduler-docker-local plugin --- plugins/00_dokku-standard/core-post-deploy | 23 ------------- plugins/named-containers/plugin.toml | 4 --- .../core-post-deploy | 33 +++++++++++++++---- .../scheduler-docker-local/scheduler-deploy | 1 + 4 files changed, 28 insertions(+), 33 deletions(-) delete mode 100755 plugins/00_dokku-standard/core-post-deploy delete mode 100644 plugins/named-containers/plugin.toml rename plugins/{named-containers => scheduler-docker-local}/core-post-deploy (53%) diff --git a/plugins/00_dokku-standard/core-post-deploy b/plugins/00_dokku-standard/core-post-deploy deleted file mode 100755 index 7b21978cb..000000000 --- a/plugins/00_dokku-standard/core-post-deploy +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash -set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x -source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" - -cleanup_container_state() { - declare desc="core post-deploy state cleanup" - local trigger="core-post-deploy cleanup_container_state" - local APP="$1"; local PROCTYPES="$(egrep -v "^#" "$DOKKU_ROOT/$APP/DOKKU_SCALE" | awk -F '=' '{ print $1 }' | xargs)" - local CONTAINER_FILES="$(find "$DOKKU_ROOT/$APP" -maxdepth 1 -name "CONTAINER.*" -printf "%f\n" 2>/dev/null | sort -t . -k 3 -n | xargs)" - - local CONTAINER_FILE - for CONTAINER_FILE in $CONTAINER_FILES; do - local CONTAINER_TYPE="$(awk -F '.' '{ print $2 }' <<< "$CONTAINER_FILE")" - if [[ "$(is_val_in_list "$CONTAINER_TYPE" "$PROCTYPES" " ")" == "false" ]]; then - dokku_log_info1 "Container type ($CONTAINER_TYPE) is no longer defined. Removing state" - local IP_FILE="${CONTAINER_FILE//CONTAINER/IP}" - local PORT_FILE="${CONTAINER_FILE//CONTAINER/PORT}" - rm -f "$DOKKU_ROOT/$APP/$CONTAINER_FILE" "$DOKKU_ROOT/$APP/$IP_FILE" "$DOKKU_ROOT/$APP/$PORT_FILE" - fi - done -} - -cleanup_container_state "$@" diff --git a/plugins/named-containers/plugin.toml b/plugins/named-containers/plugin.toml deleted file mode 100644 index d9c2c6728..000000000 --- a/plugins/named-containers/plugin.toml +++ /dev/null @@ -1,4 +0,0 @@ -[plugin] -description = "dokku core named containers plugin" -version = "0.11.6" -[plugin.config] diff --git a/plugins/named-containers/core-post-deploy b/plugins/scheduler-docker-local/core-post-deploy similarity index 53% rename from plugins/named-containers/core-post-deploy rename to plugins/scheduler-docker-local/core-post-deploy index 70d9b6328..61790e665 100755 --- a/plugins/named-containers/core-post-deploy +++ b/plugins/scheduler-docker-local/core-post-deploy @@ -1,14 +1,35 @@ #!/usr/bin/env bash set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" +source "$PLUGIN_AVAILABLE_PATH/config/functions" -named_containers_core_post_deploy() { - declare desc="names deployed app container is consistent manner" - local trigger="named_containers_core_post_deploy" - local APP="$1"; local APP_ROOT="$DOKKU_ROOT/$APP" - local container +scheduler-docker-local-core-post-deploy() { + declare desc="core post-deploy state cleanup" + declare trigger="scheduler-docker-local core-post-deploy" + declare APP="$1"; + local APP_ROOT="$DOKKU_ROOT/$APP" + + local DOKKU_SCHEDULER=$(config_get "$APP" DOKKU_SCHEDULER || echo "docker-local") + if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then + return + fi + + local PROCTYPES="$(egrep -v "^#" "$DOKKU_ROOT/$APP/DOKKU_SCALE" | awk -F '=' '{ print $1 }' | xargs)" + local CONTAINER_FILES="$(find "$DOKKU_ROOT/$APP" -maxdepth 1 -name "CONTAINER.*" -printf "%f\n" 2>/dev/null | sort -t . -k 3 -n | xargs)" + + local CONTAINER_FILE + for CONTAINER_FILE in $CONTAINER_FILES; do + local CONTAINER_TYPE="$(awk -F '.' '{ print $2 }' <<< "$CONTAINER_FILE")" + if [[ "$(is_val_in_list "$CONTAINER_TYPE" "$PROCTYPES" " ")" == "false" ]]; then + dokku_log_info1 "Container type ($CONTAINER_TYPE) is no longer defined. Removing state" + local IP_FILE="${CONTAINER_FILE//CONTAINER/IP}" + local PORT_FILE="${CONTAINER_FILE//CONTAINER/PORT}" + rm -f "$DOKKU_ROOT/$APP/$CONTAINER_FILE" "$DOKKU_ROOT/$APP/$IP_FILE" "$DOKKU_ROOT/$APP/$PORT_FILE" + fi + done shopt -s nullglob + local container for container in $APP_ROOT/CONTAINER.*; do local DYNO=$(echo "$container" | sed -r 's/.*CONTAINER\.(.*)/\1/') || true local NAME="$APP.$DYNO" @@ -38,4 +59,4 @@ named_containers_core_post_deploy() { shopt -u nullglob } -named_containers_core_post_deploy "$@" +scheduler-docker-local-core-post-deploy "$@" diff --git a/plugins/scheduler-docker-local/scheduler-deploy b/plugins/scheduler-docker-local/scheduler-deploy index b212b40c1..7abc8a059 100755 --- a/plugins/scheduler-docker-local/scheduler-deploy +++ b/plugins/scheduler-docker-local/scheduler-deploy @@ -6,6 +6,7 @@ source "$PLUGIN_AVAILABLE_PATH/config/functions" scheduler-docker-local-scheduler-deploy() { declare desc="deploys an image tag for a given application" + declare trigger="scheduler-docker-local scheduler-deploy" declare DOKKU_SCHEDULER="$1" APP="$2" IMAGE_TAG="$3" if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then From da1ea2dda8f656370813133d7b196c360453570f Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 7 Feb 2018 20:45:43 -0700 Subject: [PATCH 05/25] refactor: drop unmaintained ls subcommand The correct way to handle getting the status should be ps:report. Also cleaned up an issue where ps:report failed to catch errors for non-running containers. --- plugins/00_dokku-standard/subcommands/ls | 31 ------------------------ plugins/ps/subcommands/report | 4 +-- tests/unit/10_ps-herokuish.bats | 7 +----- 3 files changed, 3 insertions(+), 39 deletions(-) delete mode 100755 plugins/00_dokku-standard/subcommands/ls diff --git a/plugins/00_dokku-standard/subcommands/ls b/plugins/00_dokku-standard/subcommands/ls deleted file mode 100755 index b5809c148..000000000 --- a/plugins/00_dokku-standard/subcommands/ls +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash -set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x -source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" - -dokku_ls_cmd() { - declare desc="lists installed apps with status" - local cmd="ls" - local installed_apps=$(dokku_apps) - local dokku_app - - dokku_col_log_info1_quiet "App Name" "Container Type" "Container Id" "Status" - - for dokku_app in $installed_apps; do - local APP=$(basename "$dokku_app") - local DOKKU_APP_CIDS=$(get_app_container_ids "$APP") - local DOCKER_RUNNING_CONTAINERS=$(docker ps -q --no-trunc) - if [[ -n $DOKKU_APP_CIDS ]]; then - local DOKKU_APP_CID - for DOKKU_APP_CID in $DOKKU_APP_CIDS; do - local DOKKU_APP_CONTAINER_STATUS="stopped" - [[ $DOCKER_RUNNING_CONTAINERS =~ $DOKKU_APP_CID ]] && local DOKKU_APP_CONTAINER_STATUS="running" - local DOKKU_APP_CONTAINER_TYPE=$(grep -l "$DOKKU_APP_CID" "$DOKKU_ROOT/$APP"/CONTAINER.* | awk -F '/' '{ print $5 }' | awk -F '.' '{ print $2 }') - dokku_col_log_msg "$APP" "$DOKKU_APP_CONTAINER_TYPE" "${DOKKU_APP_CID:0:12}" "$DOKKU_APP_CONTAINER_STATUS" - done - else - dokku_col_log_msg "$APP" "NOT_DEPLOYED" "NOT_DEPLOYED" "NOT_DEPLOYED" - fi - done -} - -dokku_ls_cmd "$@" diff --git a/plugins/ps/subcommands/report b/plugins/ps/subcommands/report index af0ebac57..7b9755701 100755 --- a/plugins/ps/subcommands/report +++ b/plugins/ps/subcommands/report @@ -13,7 +13,7 @@ report_single_app() { local APP_CIDS=$(get_app_container_ids "$APP"); local PROCS=0; local RUNNING="" for CID in $APP_CIDS; do - local APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" 2>/dev/null || true) + local APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" 2> /dev/null || true) if [[ "$APP_CONTAINER_STATUS" == "true" ]]; then RUNNING+="0"; else RUNNING+="1"; fi PROCS=$((PROCS + 1)) done @@ -38,7 +38,7 @@ report_single_app() { for CONTAINER_FILE in $CONTAINER_FILES; do CID=$(< "$DOKKU_ROOT/$APP/$CONTAINER_FILE") APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" 2> /dev/null) - [[ -z "$APP_CONTAINER_STATUS" ]] && APP_CONTAINER_STATUS="dead" + [[ -z "$APP_CONTAINER_STATUS" ]] && APP_CONTAINER_STATUS="missing" STATUSES+=("${CONTAINER_FILE#*.}:$APP_CONTAINER_STATUS#${CID:0:12}") done local flag_map=( diff --git a/tests/unit/10_ps-herokuish.bats b/tests/unit/10_ps-herokuish.bats index 4bd794222..5bef721db 100644 --- a/tests/unit/10_ps-herokuish.bats +++ b/tests/unit/10_ps-herokuish.bats @@ -147,12 +147,7 @@ teardown() { echo "status: "$status assert_success - run bash -c "dokku ls" - echo "output: "$output - echo "status: "$status - assert_success - - run bash -c "dokku --quiet ls | grep $TEST_APP | grep -q stopped" + run bash -c "dokku --quiet ps:report $TEST_APP | grep -q exited" echo "output: "$output echo "status: "$status assert_success From 8474c72a10742174b6497860175fa8fa2f066505 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 7 Feb 2018 21:13:32 -0700 Subject: [PATCH 06/25] refactor: move container stopping into new scheduler-stop plugin trigger --- plugins/ps/functions | 16 ++++--------- plugins/scheduler-docker-local/scheduler-stop | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+), 12 deletions(-) create mode 100755 plugins/scheduler-docker-local/scheduler-stop diff --git a/plugins/ps/functions b/plugins/ps/functions index 0db976680..39401bc20 100755 --- a/plugins/ps/functions +++ b/plugins/ps/functions @@ -108,21 +108,13 @@ ps_start() { ps_stop() { declare desc="stops app" local APP="$1"; verify_app_name "$APP" - local DOKKU_APP_RUNNING_CONTAINER_IDS=$(get_app_running_container_ids "$APP") ! (is_deployed "$APP") && echo "App $APP has not been deployed" && exit 0 - if [[ -n "$DOKKU_APP_RUNNING_CONTAINER_IDS" ]]; then - local DOKKU_DOCKER_STOP_TIMEOUT="$(config_get "$APP" DOKKU_DOCKER_STOP_TIMEOUT || true)" - [[ $DOKKU_DOCKER_STOP_TIMEOUT ]] && DOCKER_STOP_TIME_ARG="--time=${DOKKU_DOCKER_STOP_TIMEOUT}" - - echo "Stopping $APP ..." - # shellcheck disable=SC2086 - docker stop $DOCKER_STOP_TIME_ARG $DOKKU_APP_RUNNING_CONTAINER_IDS > /dev/null || true - plugn trigger post-stop "$APP" - else - echo "App $APP already stopped" - fi + echo "Stopping $APP ..." + local DOKKU_SCHEDULER=$(config_get "$APP" DOKKU_SCHEDULER || echo "docker-local") + plugn trigger scheduler-stop "$DOKKU_SCHEDULER" "$APP" + plugn trigger post-stop "$APP" } ps_rebuild() { diff --git a/plugins/scheduler-docker-local/scheduler-stop b/plugins/scheduler-docker-local/scheduler-stop new file mode 100755 index 000000000..7a95ece0d --- /dev/null +++ b/plugins/scheduler-docker-local/scheduler-stop @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" + +scheduler-docker-local-scheduler-stop() { + declare desc="scheduler-docker-local scheduler-stop plugin trigger" + declare trigger="scheduler-docker-local scheduler-stop" + declare DOKKU_SCHEDULER="$1" APP="$2" + + if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then + return + fi + + local DOKKU_APP_RUNNING_CONTAINER_IDS=$(get_app_running_container_ids "$APP") + local DOKKU_DOCKER_STOP_TIMEOUT="$(config_get "$APP" DOKKU_DOCKER_STOP_TIMEOUT || true)" + + [[ -n "$DOKKU_DOCKER_STOP_TIMEOUT" ]] && DOCKER_STOP_TIME_ARG="--time=${DOKKU_DOCKER_STOP_TIMEOUT}" + + # shellcheck disable=SC2086 + docker stop $DOCKER_STOP_TIME_ARG $DOKKU_APP_RUNNING_CONTAINER_IDS > /dev/null || true +} + + +scheduler-docker-local-scheduler-stop "$@" From 06a5ac9fc70ec3961a45c36aafe2fec1493a6212 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 7 Feb 2018 21:29:53 -0700 Subject: [PATCH 07/25] refactor: move docker-related commands from tags plugin into scheduler-docker-local plugin --- plugins/scheduler-docker-local/README.md | 0 .../scheduler-tags-create} | 22 ++++++++++++++----- .../scheduler-tags-destroy | 17 ++++++++++++++ plugins/tags/subcommands/create | 6 +++-- plugins/tags/subcommands/default | 1 - plugins/tags/subcommands/deploy | 1 - plugins/tags/subcommands/destroy | 5 +++-- 7 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 plugins/scheduler-docker-local/README.md rename plugins/{tags/functions => scheduler-docker-local/scheduler-tags-create} (62%) mode change 100755 => 100644 create mode 100644 plugins/scheduler-docker-local/scheduler-tags-destroy diff --git a/plugins/scheduler-docker-local/README.md b/plugins/scheduler-docker-local/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/plugins/tags/functions b/plugins/scheduler-docker-local/scheduler-tags-create old mode 100755 new mode 100644 similarity index 62% rename from plugins/tags/functions rename to plugins/scheduler-docker-local/scheduler-tags-create index 2dc060c21..2e46c6ae1 --- a/plugins/tags/functions +++ b/plugins/scheduler-docker-local/scheduler-tags-create @@ -2,6 +2,21 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" +scheduler-docker-local-scheduler-tags-create() { + declare desc="scheduler-docker-local scheduler-stop plugin trigger" + declare trigger="scheduler-docker-local scheduler-stop" + declare DOKKU_SCHEDULER="$1" APP="$2" SOURCE_IMAGE="$3" TARGET_IMAGE="$4" + + if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then + return + fi + + local TAG_OPTS="" + [[ $(is_tag_force_available) ]] && TAG_OPTS="-f" + # shellcheck disable=SC2086 + docker tag $TAG_OPTS "$SOURCE_IMAGE" "$TARGET_IMAGE" +} + is_tag_force_available() { CLIENT_VERSION_STRING="$(get_docker_version)" MAJOR_VERSION=$(echo "$CLIENT_VERSION_STRING" | awk '{split($0,a,"."); print a[1]}') @@ -18,9 +33,4 @@ is_tag_force_available() { fi } -tag_image() { - declare desc="convenience method for docker tag interface" - [[ $(is_tag_force_available) ]] && TAG_OPTS="-f" - # shellcheck disable=SC2086 - docker tag $TAG_OPTS "$1" "$2" -} +scheduler-docker-local-scheduler-tags-create "$@" diff --git a/plugins/scheduler-docker-local/scheduler-tags-destroy b/plugins/scheduler-docker-local/scheduler-tags-destroy new file mode 100644 index 000000000..779ebc4f4 --- /dev/null +++ b/plugins/scheduler-docker-local/scheduler-tags-destroy @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" + +scheduler-docker-local-scheduler-tags-destroy() { + declare desc="scheduler-docker-local scheduler-stop plugin trigger" + declare trigger="scheduler-docker-local scheduler-stop" + declare DOKKU_SCHEDULER="$1" APP="$2" IMAGE_REPO="$3" IMAGE_TAG="$4" + + if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then + return + fi + + docker rmi "$IMAGE_REPO:$IMAGE_TAG" +} + +scheduler-docker-local-scheduler-tags-destroy "$@" diff --git a/plugins/tags/subcommands/create b/plugins/tags/subcommands/create index 00adbea58..2a90f8c8c 100755 --- a/plugins/tags/subcommands/create +++ b/plugins/tags/subcommands/create @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" -source "$PLUGIN_AVAILABLE_PATH/tags/functions" +source "$PLUGIN_AVAILABLE_PATH/config/functions" tags_create_cmd() { declare desc="creates an images tag for app via command line" @@ -10,7 +10,9 @@ tags_create_cmd() { local APP="$2"; local IMAGE_TAG="$3"; local IMAGE_REPO=$(get_app_image_repo "$APP") verify_app_name "$APP" - tag_image "$IMAGE_REPO:latest" "$IMAGE_REPO:$IMAGE_TAG" + local DOKKU_SCHEDULER=$(config_get "$APP" DOKKU_SCHEDULER || echo "docker-local") + plugn trigger scheduler-tags-create "$DOKKU_SCHEDULER" "$APP" "$IMAGE_REPO:latest" "$IMAGE_REPO:$IMAGE_TAG" + dokku_log_info2_quiet "Added $IMAGE_TAG tag to $IMAGE_REPO" plugn trigger tags-create "$APP" "$IMAGE_TAG" } diff --git a/plugins/tags/subcommands/default b/plugins/tags/subcommands/default index de16fb926..1b9da0050 100755 --- a/plugins/tags/subcommands/default +++ b/plugins/tags/subcommands/default @@ -1,7 +1,6 @@ #!/usr/bin/env bash set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" -source "$PLUGIN_AVAILABLE_PATH/tags/functions" tags_main_cmd() { declare desc="shows docker images tags for app via command line" diff --git a/plugins/tags/subcommands/deploy b/plugins/tags/subcommands/deploy index 35c573595..f924bea67 100755 --- a/plugins/tags/subcommands/deploy +++ b/plugins/tags/subcommands/deploy @@ -1,7 +1,6 @@ #!/usr/bin/env bash set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" -source "$PLUGIN_AVAILABLE_PATH/tags/functions" tags_deploy_cmd() { declare desc="deploys an app with a given tagged image via command line" diff --git a/plugins/tags/subcommands/destroy b/plugins/tags/subcommands/destroy index 4fec517ab..5a8293c4a 100755 --- a/plugins/tags/subcommands/destroy +++ b/plugins/tags/subcommands/destroy @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" -source "$PLUGIN_AVAILABLE_PATH/tags/functions" +source "$PLUGIN_AVAILABLE_PATH/config/functions" tags_destroy_cmd() { declare desc="destroys an app image tag via command line" @@ -16,7 +16,8 @@ tags_destroy_cmd() { ;; *) - docker rmi "$IMAGE_REPO:$IMAGE_TAG" + local DOKKU_SCHEDULER=$(config_get "$APP" DOKKU_SCHEDULER || echo "docker-local") + plugn trigger scheduler-tags-destroy "$DOKKU_SCHEDULER" "$APP" "$IMAGE_REPO" "$IMAGE_TAG" ;; esac plugn trigger tags-destroy "$APP" "$IMAGE_TAG" From 46f912659fc4ce6f18d9fbe5685c0f8f20cdafc1 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 7 Feb 2018 21:44:18 -0700 Subject: [PATCH 08/25] fix: make triggers executable --- plugins/scheduler-docker-local/scheduler-tags-create | 0 plugins/scheduler-docker-local/scheduler-tags-destroy | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 plugins/scheduler-docker-local/scheduler-tags-create mode change 100644 => 100755 plugins/scheduler-docker-local/scheduler-tags-destroy diff --git a/plugins/scheduler-docker-local/scheduler-tags-create b/plugins/scheduler-docker-local/scheduler-tags-create old mode 100644 new mode 100755 diff --git a/plugins/scheduler-docker-local/scheduler-tags-destroy b/plugins/scheduler-docker-local/scheduler-tags-destroy old mode 100644 new mode 100755 From 3f1de1fd10e370852d3209eb0104f40473ddda8b Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 7 Feb 2018 21:52:17 -0700 Subject: [PATCH 09/25] refactor: drop all application-related docker code from apps plugin --- plugins/apps/functions | 16 ++-------- plugins/apps/post-delete | 3 -- plugins/scheduler-docker-local/README.md | 0 .../scheduler-docker-local/core-post-deploy | 2 +- plugins/scheduler-docker-local/post-delete | 30 +++++++++++++++++++ plugins/scheduler-docker-local/scheduler-stop | 18 +++++++++-- 6 files changed, 49 insertions(+), 20 deletions(-) delete mode 100644 plugins/scheduler-docker-local/README.md create mode 100755 plugins/scheduler-docker-local/post-delete diff --git a/plugins/apps/functions b/plugins/apps/functions index 1bfbf49a2..2ce635700 100755 --- a/plugins/apps/functions +++ b/plugins/apps/functions @@ -32,21 +32,11 @@ apps_destroy() { fi echo "Destroying $APP (including all add-ons)" - plugn trigger pre-delete "$APP" "$IMAGE_TAG" - local DOKKU_APP_CIDS=$(get_app_container_ids "$APP") - local DOKKU_DOCKER_STOP_TIMEOUT="$(config_get "$APP" DOKKU_DOCKER_STOP_TIMEOUT || true)" - [[ $DOKKU_DOCKER_STOP_TIMEOUT ]] && DOCKER_STOP_TIME_ARG="--time=${DOKKU_DOCKER_STOP_TIMEOUT}" - - if [[ -n $DOKKU_APP_CIDS ]]; then - local cid - for cid in $DOKKU_APP_CIDS; do - # shellcheck disable=SC2086 - docker stop $DOCKER_STOP_TIME_ARG "$cid" > /dev/null || true - docker rm "$cid" > /dev/null || true - done - fi + local DOKKU_SCHEDULER=$(config_get "$APP" DOKKU_SCHEDULER || echo "docker-local") + local REMOVE_CONTAINERS="true" + plugn trigger scheduler-stop "$DOKKU_SCHEDULER" "$APP" "$REMOVE_CONTAINERS" plugn trigger post-delete "$APP" "$IMAGE_TAG" } diff --git a/plugins/apps/post-delete b/plugins/apps/post-delete index be58c6885..18069bfdc 100755 --- a/plugins/apps/post-delete +++ b/plugins/apps/post-delete @@ -13,9 +13,6 @@ app_post_delete() { rm -rf "${DOKKU_ROOT:?}/$APP" > /dev/null fi - # remove all application containers & images - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a --no-trunc | egrep "dokku/${APP}:" | awk '{ print $1 }' | xargs) &>/dev/null || true # shellcheck disable=SC2046 docker rmi $(docker images -q "$IMAGE_REPO" | xargs) &>/dev/null || true } diff --git a/plugins/scheduler-docker-local/README.md b/plugins/scheduler-docker-local/README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/plugins/scheduler-docker-local/core-post-deploy b/plugins/scheduler-docker-local/core-post-deploy index 61790e665..02120fe86 100755 --- a/plugins/scheduler-docker-local/core-post-deploy +++ b/plugins/scheduler-docker-local/core-post-deploy @@ -4,7 +4,7 @@ source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" source "$PLUGIN_AVAILABLE_PATH/config/functions" scheduler-docker-local-core-post-deploy() { - declare desc="core post-deploy state cleanup" + declare desc="scheduler-docker-local core-post-deploy state cleanup" declare trigger="scheduler-docker-local core-post-deploy" declare APP="$1"; local APP_ROOT="$DOKKU_ROOT/$APP" diff --git a/plugins/scheduler-docker-local/post-delete b/plugins/scheduler-docker-local/post-delete new file mode 100755 index 000000000..59297b3ec --- /dev/null +++ b/plugins/scheduler-docker-local/post-delete @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" +source "$PLUGIN_AVAILABLE_PATH/config/functions" + +scheduler-docker-local-post-delete() { + declare desc="scheduler-docker-local post-delete plugin trigger" + declare trigger="scheduler-docker-local post-delete" + declare APP="$1" + + local DOKKU_SCHEDULER=$(config_get "$APP" DOKKU_SCHEDULER || echo "docker-local") + if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then + return + fi + + local IMAGE_REPO=$(get_app_image_repo "$APP") + + # remove all application containers & images + # shellcheck disable=SC2046 + local DOKKU_APP_CIDS=$(docker ps -a --no-trunc | egrep "dokku/${APP}:" | awk '{ print $1 }' | xargs) + if [[ -n "$DOKKU_APP_CIDS" ]]; then + # shellcheck disable=SC2086 + docker rm -f $DOKKU_APP_CIDS &>/dev/null || true + fi + + # shellcheck disable=SC2046 + docker rmi $(docker images -q "$IMAGE_REPO" | xargs) &>/dev/null || true +} + +scheduler-docker-local-post-delete "$@" diff --git a/plugins/scheduler-docker-local/scheduler-stop b/plugins/scheduler-docker-local/scheduler-stop index 7a95ece0d..466a1c40e 100755 --- a/plugins/scheduler-docker-local/scheduler-stop +++ b/plugins/scheduler-docker-local/scheduler-stop @@ -1,11 +1,12 @@ #!/usr/bin/env bash set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" +source "$PLUGIN_AVAILABLE_PATH/config/functions" scheduler-docker-local-scheduler-stop() { declare desc="scheduler-docker-local scheduler-stop plugin trigger" declare trigger="scheduler-docker-local scheduler-stop" - declare DOKKU_SCHEDULER="$1" APP="$2" + declare DOKKU_SCHEDULER="$1" APP="$2" REMOVE_CONTAINERS="$3" if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then return @@ -16,8 +17,19 @@ scheduler-docker-local-scheduler-stop() { [[ -n "$DOKKU_DOCKER_STOP_TIMEOUT" ]] && DOCKER_STOP_TIME_ARG="--time=${DOKKU_DOCKER_STOP_TIMEOUT}" - # shellcheck disable=SC2086 - docker stop $DOCKER_STOP_TIME_ARG $DOKKU_APP_RUNNING_CONTAINER_IDS > /dev/null || true + if [[ -n "$DOKKU_APP_RUNNING_CONTAINER_IDS" ]]; then + # shellcheck disable=SC2086 + docker stop $DOCKER_STOP_TIME_ARG $DOKKU_APP_RUNNING_CONTAINER_IDS > /dev/null || true + fi + + if [[ "$REMOVE_CONTAINERS" == "true" ]]; then + local DOKKU_APP_CIDS=$(get_app_container_ids "$APP") + + if [[ -n "$DOKKU_APP_CIDS" ]]; then + # shellcheck disable=SC2086 + docker rm -f $DOKKU_APP_CIDS > /dev/null || true + fi + fi } From 7a6d7716899f100a6969096cdec7063e7b4f9188 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Mon, 12 Feb 2018 02:17:44 -0500 Subject: [PATCH 10/25] fix: add missing source --- plugins/common/functions | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/common/functions b/plugins/common/functions index 45bbb4544..424a2ff7b 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -607,6 +607,7 @@ docker_cleanup() { declare desc="cleans up all exited/dead containers and removes all dangling images" declare APP="$1" FORCE_CLEANUP="$2" local DOKKU_APP_SKIP_CLEANUP + source "$PLUGIN_AVAILABLE_PATH/config/functions" if [[ "$FORCE_CLEANUP" != "true" ]]; then [[ -z "$APP" ]] && DOKKU_APP_SKIP_CLEANUP="$(config_get "$APP" DOKKU_SKIP_CLEANUP || true)" From a8d42ea8be275b709baf3e4b38ffcf4714ef2210 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Mon, 12 Feb 2018 02:21:34 -0500 Subject: [PATCH 11/25] feat: use is_container_status everywhere --- plugins/common/functions | 3 +-- plugins/enter/subcommands/default | 3 +-- plugins/ps/subcommands/report | 7 +++++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/plugins/common/functions b/plugins/common/functions index 424a2ff7b..240bd215e 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -347,8 +347,7 @@ get_app_running_container_ids() { CIDS=$(get_app_container_ids "$APP" "$CONTAINER_TYPE") for CID in $CIDS; do - local APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" 2>/dev/null || true) - [[ "$APP_CONTAINER_STATUS" == "true" ]] && local APP_RUNNING_CONTAINER_IDS+="$CID " + (is_container_status "$CID" "Running") && local APP_RUNNING_CONTAINER_IDS+="$CID " done echo "$APP_RUNNING_CONTAINER_IDS" diff --git a/plugins/enter/subcommands/default b/plugins/enter/subcommands/default index 0c2c50e29..cc9296d99 100755 --- a/plugins/enter/subcommands/default +++ b/plugins/enter/subcommands/default @@ -45,8 +45,7 @@ enter_default_cmd() { fi fi - docker inspect "$ID" &> /dev/null || dokku_log_fail "Container does not exist" - docker inspect -f '{{ .State.Running }}' "$ID" | grep -q "true" > /dev/null || dokku_log_fail "Container is not running" + (is_container_status "$ID" "Running") || dokku_log_fail "Container is not running" local DOKKU_APP_SHELL="/bin/bash" DOKKU_APP_SHELL="$(config_get --global DOKKU_APP_SHELL || echo "$DOKKU_APP_SHELL")" diff --git a/plugins/ps/subcommands/report b/plugins/ps/subcommands/report index 7b9755701..0dafcdd33 100755 --- a/plugins/ps/subcommands/report +++ b/plugins/ps/subcommands/report @@ -13,8 +13,11 @@ report_single_app() { local APP_CIDS=$(get_app_container_ids "$APP"); local PROCS=0; local RUNNING="" for CID in $APP_CIDS; do - local APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" 2> /dev/null || true) - if [[ "$APP_CONTAINER_STATUS" == "true" ]]; then RUNNING+="0"; else RUNNING+="1"; fi + if (is_container_status "$CID" "Running"); then + RUNNING+="0" + else + RUNNING+="1" + fi PROCS=$((PROCS + 1)) done From 0b9d4b2580d4e8c1ad9d44bb4d4a5a90f02d31f3 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Mon, 12 Feb 2018 02:22:23 -0500 Subject: [PATCH 12/25] feat: refer to container as dead instead of missing when inspect fails --- plugins/ps/subcommands/report | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ps/subcommands/report b/plugins/ps/subcommands/report index 0dafcdd33..7e32b7714 100755 --- a/plugins/ps/subcommands/report +++ b/plugins/ps/subcommands/report @@ -40,7 +40,7 @@ report_single_app() { local APP_CONTAINER_STATUS for CONTAINER_FILE in $CONTAINER_FILES; do CID=$(< "$DOKKU_ROOT/$APP/$CONTAINER_FILE") - APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" 2> /dev/null) + APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Status}}' "$CID" 2> /dev/null) [[ -z "$APP_CONTAINER_STATUS" ]] && APP_CONTAINER_STATUS="missing" STATUSES+=("${CONTAINER_FILE#*.}:$APP_CONTAINER_STATUS#${CID:0:12}") done From d6e474f451cf78741dca39af11fc4f8d90b01eea Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Mon, 12 Feb 2018 02:44:25 -0500 Subject: [PATCH 13/25] feat: move check-deploy to scheduler-docker-local plugin --- .../check-deploy | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) rename plugins/{checks => scheduler-docker-local}/check-deploy (94%) diff --git a/plugins/checks/check-deploy b/plugins/scheduler-docker-local/check-deploy similarity index 94% rename from plugins/checks/check-deploy rename to plugins/scheduler-docker-local/check-deploy index 7afe7a56b..cae18ef5a 100755 --- a/plugins/checks/check-deploy +++ b/plugins/scheduler-docker-local/check-deploy @@ -38,10 +38,16 @@ source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" source "$PLUGIN_AVAILABLE_PATH/checks/functions" source "$PLUGIN_AVAILABLE_PATH/config/functions" -checks_check_deploy() { - declare desc="checks check-deploy plugin trigger" - local trigger="checks_check_deploy" +scheduler-docker-local-check-deploy() { + declare desc="scheduler-docker-local check-deploy plugin trigger" + local trigger="scheduler-docker-local-check-deploy" local APP="$1"; local DOKKU_APP_CONTAINER_ID="$2"; local DOKKU_APP_CONTAINER_TYPE="$3"; local DOKKU_APP_LISTEN_PORT="$4"; local DOKKU_APP_LISTEN_IP="$5" + + local DOKKU_SCHEDULER=$(config_get "$APP" DOKKU_SCHEDULER || echo "docker-local") + if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then + return + fi + if [[ -z "$DOKKU_APP_LISTEN_PORT" ]] && [[ -f "$DOKKU_ROOT/$APP/PORT" ]]; then local DOKKU_APP_LISTEN_PORT=$(< "$DOKKU_ROOT/$APP/PORT") fi @@ -107,7 +113,7 @@ checks_check_deploy() { dokku_log_info1 "Waiting for $DOKKU_DEFAULT_CHECKS_WAIT seconds ..." sleep "$DOKKU_DEFAULT_CHECKS_WAIT" - ! (is_container_running "$DOKKU_APP_CONTAINER_ID") && dokku_log_fail "App container failed to start!!" + ! (is_container_status "$DOKKU_APP_CONTAINER_ID" "Running") && dokku_log_fail "App container failed to start!!" local container_restarts="$(docker inspect -f "{{ .RestartCount }}" "$DOKKU_APP_CONTAINER_ID")" if [[ $container_restarts -ne 0 ]]; then docker stop "$DOKKU_APP_CONTAINER_ID" || true @@ -236,4 +242,4 @@ checks_check_deploy() { dokku_log_info1 "All checks successful!" } -checks_check_deploy "$@" +scheduler-docker-local-check-deploy "$@" From 00f4fa0aedaae8ec984feabcc362c6b6dff86701 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Mon, 12 Feb 2018 02:45:50 -0500 Subject: [PATCH 14/25] refactor: move pre-deploy to scheduler-docker-local plugin --- plugins/00_dokku-standard/pre-deploy | 29 ----------------- plugins/scheduler-docker-local/pre-deploy | 39 +++++++++++++++++++++++ 2 files changed, 39 insertions(+), 29 deletions(-) create mode 100755 plugins/scheduler-docker-local/pre-deploy diff --git a/plugins/00_dokku-standard/pre-deploy b/plugins/00_dokku-standard/pre-deploy index 2c4209955..4570350ae 100755 --- a/plugins/00_dokku-standard/pre-deploy +++ b/plugins/00_dokku-standard/pre-deploy @@ -2,7 +2,6 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" source "$PLUGIN_CORE_AVAILABLE_PATH/00_dokku-standard/exec-app-json-scripts" -source "$PLUGIN_AVAILABLE_PATH/config/functions" exec_app_json_scripts() { declare desc="core app.json scripts execution" @@ -13,32 +12,4 @@ exec_app_json_scripts() { execute_script "$APP" "$IMAGE_TAG" "$PHASE_SCRIPT_KEY" } -app_user_pre_deploy_trigger() { - local desc="app user pre-deploy trigger" - local APP="$1"; local IMAGE_TAG="$2"; local IMAGE; local DOCKER_ARGS - local DOKKU_APP_TYPE DOKKU_APP_USER APP_PATHS CONTAINER_PATHS - declare -a ARG_ARRAY - - IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG") - - DOKKU_APP_TYPE=$(config_get "$APP" DOKKU_APP_TYPE || true) - DOKKU_APP_USER=$(config_get "$APP" DOKKU_APP_USER || true) - DOKKU_APP_USER=${DOKKU_APP_USER:="herokuishuser"} - APP_PATHS=$(dokku --quiet storage:list "$APP" || true) - - if [[ -n "$APP_PATHS" ]]; then - CONTAINER_PATHS=$(echo "$APP_PATHS" | awk -F ':' '{ print $2 }' | xargs) - DOCKER_ARGS=$(: | plugn trigger docker-args-deploy "$APP" "$IMAGE_TAG") - # strip --restart args from DOCKER_ARGS - DOCKER_ARGS=$(sed -e "s/--restart=[[:graph:]]\+[[:blank:]]\?//g" <<< "$DOCKER_ARGS") - eval "ARG_ARRAY=($DOCKER_ARGS)" - fi - - if [[ "$DOKKU_APP_TYPE" == "herokuish" ]] && [[ -n "$CONTAINER_PATHS" ]]; then - # shellcheck disable=SC2086 - docker run $DOKKU_GLOBAL_RUN_ARGS "${ARG_ARRAY[@]}" $IMAGE /bin/bash -c "find $CONTAINER_PATHS -not -user $DOKKU_APP_USER -print0 | xargs -0 -r chown -R $DOKKU_APP_USER" || true - fi -} - exec_app_json_scripts "$@" -app_user_pre_deploy_trigger "$@" diff --git a/plugins/scheduler-docker-local/pre-deploy b/plugins/scheduler-docker-local/pre-deploy new file mode 100755 index 000000000..ffddd37a7 --- /dev/null +++ b/plugins/scheduler-docker-local/pre-deploy @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" +source "$PLUGIN_AVAILABLE_PATH/config/functions" + +scheduler-docker-local-pre-deploy() { + declare desc="scheduler-docker-local pre-deploy plugin trigger" + declare trigger="scheduler-docker-local pre-deploy" + declare APP="$1" IMAGE_TAG="$2" + local IMAGE DOCKER_ARGS DOKKU_APP_TYPE DOKKU_APP_USER APP_PATHS CONTAINER_PATHS + declare -a ARG_ARRAY + + local DOKKU_SCHEDULER=$(config_get "$APP" DOKKU_SCHEDULER || echo "docker-local") + if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then + return + fi + + IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG") + + DOKKU_APP_TYPE=$(config_get "$APP" DOKKU_APP_TYPE || true) + DOKKU_APP_USER=$(config_get "$APP" DOKKU_APP_USER || true) + DOKKU_APP_USER=${DOKKU_APP_USER:="herokuishuser"} + APP_PATHS=$(dokku --quiet storage:list "$APP" || true) + + if [[ -n "$APP_PATHS" ]]; then + CONTAINER_PATHS=$(echo "$APP_PATHS" | awk -F ':' '{ print $2 }' | xargs) + DOCKER_ARGS=$(: | plugn trigger docker-args-deploy "$APP" "$IMAGE_TAG") + # strip --restart args from DOCKER_ARGS + DOCKER_ARGS=$(sed -e "s/--restart=[[:graph:]]\+[[:blank:]]\?//g" <<< "$DOCKER_ARGS") + eval "ARG_ARRAY=($DOCKER_ARGS)" + fi + + if [[ "$DOKKU_APP_TYPE" == "herokuish" ]] && [[ -n "$CONTAINER_PATHS" ]]; then + # shellcheck disable=SC2086 + docker run $DOKKU_GLOBAL_RUN_ARGS "${ARG_ARRAY[@]}" $IMAGE /bin/bash -c "find $CONTAINER_PATHS -not -user $DOKKU_APP_USER -print0 | xargs -0 -r chown -R $DOKKU_APP_USER" || true + fi +} + +scheduler-docker-local-pre-deploy "$@" From b92dc14b68ccddf823937ee695c77f44ab907394 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Mon, 12 Feb 2018 02:46:46 -0500 Subject: [PATCH 15/25] feat: add ability to copy a single plugin over --- Makefile | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 9fbe01a42..190879c4e 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ endif include common.mk -.PHONY: all apt-update install version copyfiles man-db plugins dependencies sshcommand plugn docker aufs stack count dokku-installer vagrant-acl-add vagrant-dokku go-build +.PHONY: all apt-update install version copyfiles copyplugin man-db plugins dependencies sshcommand plugn docker aufs stack count dokku-installer vagrant-acl-add vagrant-dokku go-build include tests.mk include deb.mk @@ -76,24 +76,29 @@ copyfiles: rm -rf ${CORE_PLUGINS_PATH}/* test -d ${CORE_PLUGINS_PATH}/enabled || PLUGIN_PATH=${CORE_PLUGINS_PATH} plugn init test -d ${PLUGINS_PATH}/enabled || PLUGIN_PATH=${PLUGINS_PATH} plugn init - find plugins/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read plugin; do \ - rm -Rf ${CORE_PLUGINS_PATH}/available/$$plugin && \ - rm -Rf ${PLUGINS_PATH}/available/$$plugin && \ - rm -rf ${CORE_PLUGINS_PATH}/$$plugin && \ - rm -rf ${PLUGINS_PATH}/$$plugin && \ - cp -R plugins/$$plugin ${CORE_PLUGINS_PATH}/available && \ - rm -rf ${CORE_PLUGINS_PATH}/available/$$plugin/src && \ - ln -s ${CORE_PLUGINS_PATH}/available/$$plugin ${PLUGINS_PATH}/available; \ - find /var/lib/dokku/ -xtype l -delete;\ - PLUGIN_PATH=${CORE_PLUGINS_PATH} plugn enable $$plugin ;\ - PLUGIN_PATH=${PLUGINS_PATH} plugn enable $$plugin ;\ - done + find plugins/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | while read plugin; do $(MAKE) copyplugin PLUGIN_NAME=$$plugin; done ifndef SKIP_GO_CLEAN $(MAKE) go-clean endif chown dokku:dokku -R ${PLUGINS_PATH} ${CORE_PLUGINS_PATH} || true $(MAKE) addman +copyplugin: +ifndef PLUGIN_NAME + $(error PLUGIN_NAME not specified) +endif + rm -Rf ${CORE_PLUGINS_PATH}/available/$(PLUGIN_NAME) && \ + rm -Rf ${PLUGINS_PATH}/available/$(PLUGIN_NAME) && \ + rm -rf ${CORE_PLUGINS_PATH}/$(PLUGIN_NAME) && \ + rm -rf ${PLUGINS_PATH}/$(PLUGIN_NAME) && \ + cp -R plugins/$(PLUGIN_NAME) ${CORE_PLUGINS_PATH}/available && \ + rm -rf ${CORE_PLUGINS_PATH}/available/$(PLUGIN_NAME)/src && \ + ln -s ${CORE_PLUGINS_PATH}/available/$(PLUGIN_NAME) ${PLUGINS_PATH}/available; \ + find /var/lib/dokku/ -xtype l -delete;\ + PLUGIN_PATH=${CORE_PLUGINS_PATH} plugn enable $(PLUGIN_NAME) ;\ + PLUGIN_PATH=${PLUGINS_PATH} plugn enable $(PLUGIN_NAME) + chown dokku:dokku -R ${PLUGINS_PATH} ${CORE_PLUGINS_PATH} || true + addman: help2man man-db mkdir -p /usr/local/share/man/man1 help2man -Nh help -v version -n "configure and get information from your dokku installation" -o /usr/local/share/man/man1/dokku.1 dokku From 894984a002cbdc27effb9ee419959d819f7c8dee Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Mon, 5 Mar 2018 22:56:18 -0500 Subject: [PATCH 16/25] hack: temp-fix for renames --- plugins/scheduler-docker-local/core-post-deploy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/scheduler-docker-local/core-post-deploy b/plugins/scheduler-docker-local/core-post-deploy index 02120fe86..793c65dfa 100755 --- a/plugins/scheduler-docker-local/core-post-deploy +++ b/plugins/scheduler-docker-local/core-post-deploy @@ -34,6 +34,7 @@ scheduler-docker-local-core-post-deploy() { local DYNO=$(echo "$container" | sed -r 's/.*CONTAINER\.(.*)/\1/') || true local NAME="$APP.$DYNO" local CURRENT_CONTAINER_ID="$(< "$container")" + # TODO: Ensure these are from the current service local PREVIOUS_CIDS=$(docker ps -a -q -f name="^.?$NAME\$" | xargs) || true if [[ -n $PREVIOUS_CIDS ]]; then dokku_log_info1_quiet "Found previous container(s) ($PREVIOUS_CIDS) named $NAME" @@ -45,7 +46,7 @@ scheduler-docker-local-core-post-deploy() { if [[ "$PREVIOUS_CONTAINER_STATUS" != "dead" ]]; then local CONTAINER_DATE_NAME="$NAME.$(date +%s)" dokku_log_info2_quiet "Renaming container ($cid) ${NAME} to $CONTAINER_DATE_NAME" - docker rename "$NAME" "$CONTAINER_DATE_NAME" > /dev/null + docker rename "$NAME" "$CONTAINER_DATE_NAME" > /dev/null 2>&1 || dokku_log_warn "Unable to rename container" fi done fi From c621b3ed694e88f877713107b1785ade3b7aebef Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Mon, 2 Apr 2018 23:22:29 -0400 Subject: [PATCH 17/25] chore: drop unused function --- plugins/00_dokku-standard/subcommands/cleanup | 2 +- plugins/common/functions | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/plugins/00_dokku-standard/subcommands/cleanup b/plugins/00_dokku-standard/subcommands/cleanup index 6403f6bdb..c88a9901a 100755 --- a/plugins/00_dokku-standard/subcommands/cleanup +++ b/plugins/00_dokku-standard/subcommands/cleanup @@ -2,7 +2,7 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" -dokku_cleanup_cmd(){ +dokku_cleanup_cmd() { declare desc="cleans up old deployment cruft" local cmd="cleanup" diff --git a/plugins/common/functions b/plugins/common/functions index 240bd215e..f489040e9 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -398,18 +398,6 @@ is_deployed() { fi } -is_container_running() { - declare desc="return 0 if given docker container id is in running state" - local CID=$1 - local CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" || true) - - if [[ "$CONTAINER_STATUS" == "true" ]]; then - return 0 - else - return 1 - fi -} - is_container_status() { declare desc="return 0 if given docker container id is in given state" local CID=$1 From 85b00385a4715bae45e019be8e10335f7d3ad870 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Mon, 2 Apr 2018 23:28:29 -0400 Subject: [PATCH 18/25] feat: implement docker-local cleanup hook --- plugins/common/functions | 3 +++ .../scheduler-docker-cleanup | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100755 plugins/scheduler-docker-local/scheduler-docker-cleanup diff --git a/plugins/common/functions b/plugins/common/functions index f489040e9..34599a5a4 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -605,6 +605,9 @@ docker_cleanup() { fi dokku_log_info1 "Cleaning up..." + local DOKKU_SCHEDULER="docker-local" + [[ -n "$APP" ]] && DOKKU_SCHEDULER=$(config_get "$APP" DOKKU_SCHEDULER || echo "docker-local") + plugn trigger scheduler-docker-cleanup "$DOKKU_SCHEDULER" "$APP" "$FORCE_CLEANUP" # delete all non-running containers # shellcheck disable=SC2046 diff --git a/plugins/scheduler-docker-local/scheduler-docker-cleanup b/plugins/scheduler-docker-local/scheduler-docker-cleanup new file mode 100755 index 000000000..cd68209a7 --- /dev/null +++ b/plugins/scheduler-docker-local/scheduler-docker-cleanup @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" + +scheduler-docker-local-scheduler-docker-cleanup() { + declare desc="scheduler-docker-local scheduler-docker-cleanup plugin trigger" + declare trigger="scheduler-docker-local scheduler-docker-cleanup" + declare DOKKU_SCHEDULER="$1" APP="$2" FORCE="$3" + + if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then + return + fi + + # delete all non-running containers + # shellcheck disable=SC2046 + docker rm $(docker ps -a -f "status=exited" -f "label=$DOKKU_CONTAINER_LABEL" -q) &> /dev/null || true + + # delete all dead containers + # shellcheck disable=SC2046 + docker rm $(docker ps -a -f "status=dead" -f "label=$DOKKU_CONTAINER_LABEL" -q) &> /dev/null || true + + # delete unused images + # shellcheck disable=SC2046 + docker rmi $(docker images -f 'dangling=true' -q) &> /dev/null & +} + +scheduler-docker-local-scheduler-docker-cleanup "$@" From 867e3317aadfd1f47b89ee877f13ab640024c7e4 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 3 Apr 2018 01:21:50 -0400 Subject: [PATCH 19/25] chore: minor cleanup to container and argument handling --- plugins/00_dokku-standard/subcommands/cleanup | 4 +++- plugins/common/common.go | 4 ++-- plugins/common/functions | 6 +++--- plugins/ps/subcommands/report | 2 +- plugins/scheduler-docker-local/post-delete | 2 +- plugins/scheduler-docker-local/scheduler-stop | 2 +- tests/unit/10_ps-herokuish.bats | 2 +- 7 files changed, 12 insertions(+), 10 deletions(-) diff --git a/plugins/00_dokku-standard/subcommands/cleanup b/plugins/00_dokku-standard/subcommands/cleanup index c88a9901a..82fad03a0 100755 --- a/plugins/00_dokku-standard/subcommands/cleanup +++ b/plugins/00_dokku-standard/subcommands/cleanup @@ -4,7 +4,9 @@ source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" dokku_cleanup_cmd() { declare desc="cleans up old deployment cruft" - local cmd="cleanup" + declare cmd="cleanup" + [[ "$1" == "$cmd" ]] && shift 1 + declare APP="$1" docker_cleanup "$APP" "true" } diff --git a/plugins/common/common.go b/plugins/common/common.go index 551f4bfec..2348b534f 100644 --- a/plugins/common/common.go +++ b/plugins/common/common.go @@ -105,7 +105,7 @@ func GetDeployingAppImageName(appName, imageTag, imageRepo string) (imageName st imageName = fmt.Sprintf("%s%s:%s", imageRemoteRepository, imageRepo, imageTag) if !VerifyImage(imageName) { - LogFail(fmt.Sprintf("app image (%s) not found", imageName)) + LogFail(fmt.Sprintf("App image (%s) not found", imageName)) } return } @@ -221,7 +221,7 @@ func GetAppImageName(appName, imageTag, imageRepo string) (imageName string) { } else { imageName = fmt.Sprintf("%v:%v", imageRepo, imageTag) if !VerifyImage(imageName) { - LogFail(fmt.Sprintf("app image (%s) not found", imageName)) + LogFail(fmt.Sprintf("App image (%s) not found", imageName)) } } return diff --git a/plugins/common/functions b/plugins/common/functions index 34599a5a4..725a3eae2 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -192,7 +192,7 @@ get_deploying_app_image_name() { [[ -z "$IMAGE_TAG" ]] && IMAGE_TAG="latest" local IMAGE="${IMAGE_REMOTE_REPOSITORY}${IMAGE_REPO}:${IMAGE_TAG}" - verify_image "$IMAGE" || dokku_log_fail "app image ($IMAGE) not found" + verify_image "$IMAGE" || dokku_log_fail "App image ($IMAGE) not found" echo "$IMAGE" } @@ -207,7 +207,7 @@ get_app_image_name() { if [[ -n "$IMAGE_TAG" ]]; then local IMAGE="$IMAGE_REPO:$IMAGE_TAG" - verify_image "$IMAGE" || dokku_log_fail "app image ($IMAGE) not found" + verify_image "$IMAGE" || dokku_log_fail "App image ($IMAGE) not found" else local IMAGE="$IMAGE_REPO:latest" fi @@ -402,7 +402,7 @@ is_container_status() { declare desc="return 0 if given docker container id is in given state" local CID=$1 local TEMPLATE="{{.State.$2}}" - local CONTAINER_STATUS=$(docker inspect -f "$TEMPLATE" "$CID" || true) + local CONTAINER_STATUS=$(docker inspect -f "$TEMPLATE" "$CID" 2> /dev/null || true) if [[ "$CONTAINER_STATUS" == "true" ]]; then return 0 diff --git a/plugins/ps/subcommands/report b/plugins/ps/subcommands/report index 7e32b7714..941201317 100755 --- a/plugins/ps/subcommands/report +++ b/plugins/ps/subcommands/report @@ -40,7 +40,7 @@ report_single_app() { local APP_CONTAINER_STATUS for CONTAINER_FILE in $CONTAINER_FILES; do CID=$(< "$DOKKU_ROOT/$APP/$CONTAINER_FILE") - APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Status}}' "$CID" 2> /dev/null) + APP_CONTAINER_STATUS=$(docker inspect -f '{{.State.Status}}' "$CID" 2> /dev/null || true) [[ -z "$APP_CONTAINER_STATUS" ]] && APP_CONTAINER_STATUS="missing" STATUSES+=("${CONTAINER_FILE#*.}:$APP_CONTAINER_STATUS#${CID:0:12}") done diff --git a/plugins/scheduler-docker-local/post-delete b/plugins/scheduler-docker-local/post-delete index 59297b3ec..fe180e91a 100755 --- a/plugins/scheduler-docker-local/post-delete +++ b/plugins/scheduler-docker-local/post-delete @@ -20,7 +20,7 @@ scheduler-docker-local-post-delete() { local DOKKU_APP_CIDS=$(docker ps -a --no-trunc | egrep "dokku/${APP}:" | awk '{ print $1 }' | xargs) if [[ -n "$DOKKU_APP_CIDS" ]]; then # shellcheck disable=SC2086 - docker rm -f $DOKKU_APP_CIDS &>/dev/null || true + docker rm -f $DOKKU_APP_CIDS > /dev/null 2>&1 || true fi # shellcheck disable=SC2046 diff --git a/plugins/scheduler-docker-local/scheduler-stop b/plugins/scheduler-docker-local/scheduler-stop index 466a1c40e..747f4b63a 100755 --- a/plugins/scheduler-docker-local/scheduler-stop +++ b/plugins/scheduler-docker-local/scheduler-stop @@ -27,7 +27,7 @@ scheduler-docker-local-scheduler-stop() { if [[ -n "$DOKKU_APP_CIDS" ]]; then # shellcheck disable=SC2086 - docker rm -f $DOKKU_APP_CIDS > /dev/null || true + docker rm -f $DOKKU_APP_CIDS > /dev/null 2>&1 || true fi fi } diff --git a/tests/unit/10_ps-herokuish.bats b/tests/unit/10_ps-herokuish.bats index 5bef721db..22e2a7e95 100644 --- a/tests/unit/10_ps-herokuish.bats +++ b/tests/unit/10_ps-herokuish.bats @@ -142,7 +142,7 @@ teardown() { echo "status: "$status assert_success - run bash -c "dokku --trace ps:restore" + run bash -c "dokku ps:restore" echo "output: "$output echo "status: "$status assert_success From 78503ed17855643507f66f3c596b191c06e0558e Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 3 Apr 2018 01:36:51 -0400 Subject: [PATCH 20/25] feat: handle case where old, renamed containers may still be running during ps:restore --- plugins/ps/subcommands/restore | 3 +++ plugins/scheduler-docker-local/pre-restore | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100755 plugins/scheduler-docker-local/pre-restore diff --git a/plugins/ps/subcommands/restore b/plugins/ps/subcommands/restore index 9f37cf524..b9c209fd1 100755 --- a/plugins/ps/subcommands/restore +++ b/plugins/ps/subcommands/restore @@ -9,6 +9,9 @@ ps_restore_cmd() { local cmd="ps:restore" local APP="$2" + local DOKKU_SCHEDULER=$(config_get "$APP" DOKKU_SCHEDULER || echo "docker-local") + plugn trigger pre-restore "$DOKKU_SCHEDULER" + if [[ -n "$APP" ]]; then if ! (is_deployed "$APP"); then dokku_log_warn "App $APP has not been deployed" diff --git a/plugins/scheduler-docker-local/pre-restore b/plugins/scheduler-docker-local/pre-restore new file mode 100755 index 000000000..660cd5193 --- /dev/null +++ b/plugins/scheduler-docker-local/pre-restore @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" + +scheduler-docker-local-pre-restore() { + declare desc="scheduler-docker-local pre-restore plugin trigger" + declare trigger="scheduler-docker-local pre-restore" + declare DOKKU_SCHEDULER="$1" + + if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then + return + fi + + # delete all "old" containers + # shellcheck disable=SC2046 + docker rm $(docker ps --format "{{.Names}}" -a -f "label=$DOKKU_CONTAINER_LABEL" -q | grep -E '(.+\..+\.[0-9]+\.[0-9]+$)') &> /dev/null || true +} + +scheduler-docker-local-pre-restore "$@" From e8972ff5a0436c52cc2b0d4c4ff148ee394e4467 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Fri, 6 Apr 2018 23:18:00 -0400 Subject: [PATCH 21/25] scratch --- docs/development/plugin-triggers.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/development/plugin-triggers.md b/docs/development/plugin-triggers.md index 8d81dcdba..f0d239570 100644 --- a/docs/development/plugin-triggers.md +++ b/docs/development/plugin-triggers.md @@ -1089,6 +1089,34 @@ APP="$1"; HOSTNAME=$(hostname -s) mail -s "$APP containers on $HOSTNAME failed to retire" ops@example.com ``` +### `scheduler-deploy` + +### `scheduler-docker-cleanup` + +### `scheduler-run` + +### `scheduler-stop` + +### `scheduler-tags-create` + +### `scheduler-tags-destroy` + +### `pre-restore` + +- Description: Allows you to +- Invoked by: `UNKNOWN` +- Arguments: `$APP $IMAGE_TAG` +- Example: + +```shell +#!/usr/bin/env bash +# DESCRIPTION + +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +APP="$1"; IMAGE_TAG="$2"; + +``` + ### `tags-create` - Description: Allows you to run commands once a tag for an application image has been added From 94fcabea15242c706225b9c25beaffd7cc9a2ce9 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 7 Apr 2018 00:05:30 -0400 Subject: [PATCH 22/25] feat: properly document all new plugin triggers --- docs/development/plugin-triggers.md | 122 +++++++++++++++--- .../scheduler-docker-cleanup | 2 +- .../scheduler-tags-create | 4 +- .../scheduler-tags-destroy | 4 +- 4 files changed, 108 insertions(+), 24 deletions(-) diff --git a/docs/development/plugin-triggers.md b/docs/development/plugin-triggers.md index f0d239570..ddeb66db7 100644 --- a/docs/development/plugin-triggers.md +++ b/docs/development/plugin-triggers.md @@ -967,6 +967,22 @@ verify_app_name "$APP" # TODO ``` +### `pre-restore` + +- Description: Allows you to run commands before all containers are restored +- Invoked by: `dokku ps:restore` +- Arguments: `$DOKKU_SCHEDULER` +- Example: + +```shell +#!/usr/bin/env bash + +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +DOKKU_SCHEDULER="$1" + +# TODO +``` + ### `pre-start` - Description: Can be used to run commands before an application is started @@ -1091,42 +1107,110 @@ mail -s "$APP containers on $HOSTNAME failed to retire" ops@example.com ### `scheduler-deploy` -### `scheduler-docker-cleanup` - -### `scheduler-run` - -### `scheduler-stop` - -### `scheduler-tags-create` - -### `scheduler-tags-destroy` - -### `pre-restore` - -- Description: Allows you to -- Invoked by: `UNKNOWN` -- Arguments: `$APP $IMAGE_TAG` +- Description: Allows you to run scheduler commands when an app is deployed +- Invoked by: `dokku deploy` +- Arguments: `$DOKKU_SCHEDULER APP IMAGE_TAG` - Example: ```shell #!/usr/bin/env bash -# DESCRIPTION set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x -APP="$1"; IMAGE_TAG="$2"; +DOKKU_SCHEDULER="$1"; APP="$2"; IMAGE_TAG="$3"; +# TODO +``` + +### `scheduler-docker-cleanup` + +- Description: Allows you to run scheduler commands when dokku cleanup is invoked +- Invoked by: `dokku deploy, dokku cleanup` +- Arguments: `$DOKKU_SCHEDULER APP FORCE_CLEANUP` +- Example: + +```shell +#!/usr/bin/env bash + +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +DOKKU_SCHEDULER="$1"; APP="$2"; FORCE_CLEANUP="$3"; + +# TODO +``` + +### `scheduler-run` + +- Description: Allows you to run scheduler commands when a command is executed for your app +- Invoked by: `dokku run` +- Arguments: `$DOKKU_SCHEDULER APP ...ARGS` +- Example: + +```shell +#!/usr/bin/env bash + +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +DOKKU_SCHEDULER="$1"; APP="$2"; ARGS="${@:3}"; + +# TODO +``` + +### `scheduler-stop` + +- Description: Allows you to run scheduler commands when a tag is destroyed +- Invoked by: `dokku apps:destroy, dokku ps:stop` +- Arguments: `$DOKKU_SCHEDULER APP REMOVE_CONTAINERS` +- Example: + +```shell +#!/usr/bin/env bash + +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +DOKKU_SCHEDULER="$1"; APP="$2"; REMOVE_CONTAINERS="$3"; + +# TODO +``` + +### `scheduler-tags-create` + +- Description: Allows you to run scheduler commands when a tag is created +- Invoked by: `dokku tags:create` +- Arguments: `$DOKKU_SCHEDULER APP SOURCE_IMAGE TARGET_IMAGE` +- Example: + +```shell +#!/usr/bin/env bash + +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +DOKKU_SCHEDULER="$1" APP="$2" SOURCE_IMAGE="$3" TARGET_IMAGE="$4" + +# TODO +``` + +### `scheduler-tags-destroy` + +- Description: Allows you to run scheduler commands when a tag is destroyed +- Invoked by: `dokku tags:destroy` +- Arguments: `$DOKKU_SCHEDULER APP IMAGE_REPO IMAGE_TAG` +- Example: + +```shell +#!/usr/bin/env bash + +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +DOKKU_SCHEDULER="$1"; APP="$2"; IMAGE_REPO="$3"; IMAGE_TAG="$4"; + +# TODO ``` ### `tags-create` -- Description: Allows you to run commands once a tag for an application image has been added +- Description: Allows you to run commands once a tag for an app image has been added - Invoked by: `dokku tags:create` - Arguments: `$APP $IMAGE_TAG` - Example: ```shell #!/usr/bin/env bash -# Upload an application image to docker hub +# Upload an app image to docker hub set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x APP="$1"; IMAGE_TAG="$2"; IMAGE=$(get_app_image_name $APP $IMAGE_TAG) diff --git a/plugins/scheduler-docker-local/scheduler-docker-cleanup b/plugins/scheduler-docker-local/scheduler-docker-cleanup index cd68209a7..bd1447349 100755 --- a/plugins/scheduler-docker-local/scheduler-docker-cleanup +++ b/plugins/scheduler-docker-local/scheduler-docker-cleanup @@ -5,7 +5,7 @@ source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" scheduler-docker-local-scheduler-docker-cleanup() { declare desc="scheduler-docker-local scheduler-docker-cleanup plugin trigger" declare trigger="scheduler-docker-local scheduler-docker-cleanup" - declare DOKKU_SCHEDULER="$1" APP="$2" FORCE="$3" + declare DOKKU_SCHEDULER="$1" APP="$2" FORCE_CLEANUP="$3" if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then return diff --git a/plugins/scheduler-docker-local/scheduler-tags-create b/plugins/scheduler-docker-local/scheduler-tags-create index 2e46c6ae1..18af1133e 100755 --- a/plugins/scheduler-docker-local/scheduler-tags-create +++ b/plugins/scheduler-docker-local/scheduler-tags-create @@ -3,8 +3,8 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" scheduler-docker-local-scheduler-tags-create() { - declare desc="scheduler-docker-local scheduler-stop plugin trigger" - declare trigger="scheduler-docker-local scheduler-stop" + declare desc="scheduler-docker-local scheduler-tags-create plugin trigger" + declare trigger="scheduler-docker-local scheduler-tags-create" declare DOKKU_SCHEDULER="$1" APP="$2" SOURCE_IMAGE="$3" TARGET_IMAGE="$4" if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then diff --git a/plugins/scheduler-docker-local/scheduler-tags-destroy b/plugins/scheduler-docker-local/scheduler-tags-destroy index 779ebc4f4..a19bc8270 100755 --- a/plugins/scheduler-docker-local/scheduler-tags-destroy +++ b/plugins/scheduler-docker-local/scheduler-tags-destroy @@ -3,8 +3,8 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" scheduler-docker-local-scheduler-tags-destroy() { - declare desc="scheduler-docker-local scheduler-stop plugin trigger" - declare trigger="scheduler-docker-local scheduler-stop" + declare desc="scheduler-docker-local scheduler-tags-destroy plugin trigger" + declare trigger="scheduler-docker-local scheduler-tags-destroy" declare DOKKU_SCHEDULER="$1" APP="$2" IMAGE_REPO="$3" IMAGE_TAG="$4" if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then From a95a69e6fc7c1242f3cdaf4674e1e2a9f58b6d9e Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 7 Apr 2018 00:07:18 -0400 Subject: [PATCH 23/25] fix: ensure all the scheduler hooks are output in event logs --- plugins/20_events/pre-restore | 1 + plugins/20_events/scheduler-deploy | 1 + plugins/20_events/scheduler-docker-cleanup | 1 + plugins/20_events/scheduler-run | 1 + plugins/20_events/scheduler-stop | 1 + plugins/20_events/scheduler-tags-create | 1 + plugins/20_events/scheduler-tags-destroy | 1 + 7 files changed, 7 insertions(+) create mode 120000 plugins/20_events/pre-restore create mode 120000 plugins/20_events/scheduler-deploy create mode 120000 plugins/20_events/scheduler-docker-cleanup create mode 120000 plugins/20_events/scheduler-run create mode 120000 plugins/20_events/scheduler-stop create mode 120000 plugins/20_events/scheduler-tags-create create mode 120000 plugins/20_events/scheduler-tags-destroy diff --git a/plugins/20_events/pre-restore b/plugins/20_events/pre-restore new file mode 120000 index 000000000..5178a749f --- /dev/null +++ b/plugins/20_events/pre-restore @@ -0,0 +1 @@ +hook \ No newline at end of file diff --git a/plugins/20_events/scheduler-deploy b/plugins/20_events/scheduler-deploy new file mode 120000 index 000000000..5178a749f --- /dev/null +++ b/plugins/20_events/scheduler-deploy @@ -0,0 +1 @@ +hook \ No newline at end of file diff --git a/plugins/20_events/scheduler-docker-cleanup b/plugins/20_events/scheduler-docker-cleanup new file mode 120000 index 000000000..5178a749f --- /dev/null +++ b/plugins/20_events/scheduler-docker-cleanup @@ -0,0 +1 @@ +hook \ No newline at end of file diff --git a/plugins/20_events/scheduler-run b/plugins/20_events/scheduler-run new file mode 120000 index 000000000..5178a749f --- /dev/null +++ b/plugins/20_events/scheduler-run @@ -0,0 +1 @@ +hook \ No newline at end of file diff --git a/plugins/20_events/scheduler-stop b/plugins/20_events/scheduler-stop new file mode 120000 index 000000000..5178a749f --- /dev/null +++ b/plugins/20_events/scheduler-stop @@ -0,0 +1 @@ +hook \ No newline at end of file diff --git a/plugins/20_events/scheduler-tags-create b/plugins/20_events/scheduler-tags-create new file mode 120000 index 000000000..5178a749f --- /dev/null +++ b/plugins/20_events/scheduler-tags-create @@ -0,0 +1 @@ +hook \ No newline at end of file diff --git a/plugins/20_events/scheduler-tags-destroy b/plugins/20_events/scheduler-tags-destroy new file mode 120000 index 000000000..5178a749f --- /dev/null +++ b/plugins/20_events/scheduler-tags-destroy @@ -0,0 +1 @@ +hook \ No newline at end of file From 39d6bb554a2cd4de7ac637149583f58d4acd3161 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 7 Apr 2018 00:08:30 -0400 Subject: [PATCH 24/25] chore: standardize on app --- docs/development/plugin-triggers.md | 60 ++++++++++++++--------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/docs/development/plugin-triggers.md b/docs/development/plugin-triggers.md index ddeb66db7..5a3cf8345 100644 --- a/docs/development/plugin-triggers.md +++ b/docs/development/plugin-triggers.md @@ -106,7 +106,7 @@ esac > To avoid issues with community plugins, this plugin trigger should be used *only* for core plugins. Please avoid using this trigger in your own plugins. -- Description: Allows running of commands after an application's processes have been scaled up, but before old containers are torn down. Dokku core currently uses this to switch traffic on nginx. +- Description: Allows running of commands after an app's processes have been scaled up, but before old containers are torn down. Dokku core currently uses this to switch traffic on nginx. - Invoked by: `dokku deploy` - Arguments: `$APP $INTERNAL_PORT $INTERNAL_IP_ADDRESS $IMAGE_TAG` - Example: @@ -426,7 +426,7 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x ### `network-get-property` -- Description: Return the network value for an application's property +- Description: Return the network value for an app's property - Invoked by: `internally triggered by a deploy` - Arguments: `$APP $KEY` - Example: @@ -471,14 +471,14 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x ### `nginx-hostname` -- Description: Allows you to customize the hostname for a given application. +- Description: Allows you to customize the hostname for a given app - Invoked by: `dokku domains:setup` - Arguments: `$APP $SUBDOMAIN $VHOST` - Example: ```shell #!/usr/bin/env bash -# Reverses the hostname for the application +# Reverses the hostname for the app set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x @@ -507,7 +507,7 @@ nginx -t ### `post-app-clone` -- Description: Allows you to run commands after an application was cloned. +- Description: Allows you to run commands after an app was cloned. - Invoked by: `dokku apps:clone` - Arguments: `$OLD_APP_NAME $NEW_APP_NAME` - Example: @@ -522,7 +522,7 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x ### `post-app-rename` -- Description: Allows you to run commands after an application was renamed. +- Description: Allows you to run commands after an app was renamed. - Invoked by: `dokku apps:rename` - Arguments: `$OLD_APP_NAME $NEW_APP_NAME` - Example: @@ -537,7 +537,7 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x ### `post-build-buildpack` -- Description: Allows you to run commands after the build image is create for a given app. Only applies to applications using buildpacks. +- Description: Allows you to run commands after the build image is create for a given app. Only applies to apps using buildpacks. - Invoked by: `internal function dokku_build() (build phase)` - Arguments: `$APP` - Example: @@ -552,7 +552,7 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x ### `post-build-dockerfile` -- Description: Allows you to run commands after the build image is create for a given app. Only applies to applications using a dockerfile. +- Description: Allows you to run commands after the build image is create for a given app. Only applies to apps using a dockerfile. - Invoked by: `internal function dokku_build() (build phase)` - Arguments: `$APP` - Example: @@ -616,7 +616,7 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x ### `post-create` -- Description: Can be used to run commands after an application is created. +- Description: Can be used to run commands after an app is created. - Invoked by: `dokku apps:create` - Arguments: `$APP` - Example: @@ -637,7 +637,7 @@ dokku postgres:link $POSTGRES $APP ### `post-delete` -- Description: Can be used to run commands after an application is deleted. +- Description: Can be used to run commands after an app is deleted. - Invoked by: `dokku apps:destroy` - Arguments: `$APP $IMAGE_TAG` - Example: @@ -658,7 +658,7 @@ dokku postgres:destroy $APP > Please see [core-post-deploy](#core-post-deploy) if contributing a core plugin with the `post-deploy` hook. -- Description: Allows running of commands after an application's processes have been scaled up, but before old containers are torn down. Dokku calls this _after_ `core-post-deploy`. Deployment Tasks are also invoked by this plugin trigger. +- Description: Allows running of commands after an app's processes have been scaled up, but before old containers are torn down. Dokku calls this _after_ `core-post-deploy`. Deployment Tasks are also invoked by this plugin trigger. - Invoked by: `dokku deploy` - Arguments: `$APP $INTERNAL_PORT $INTERNAL_IP_ADDRESS $IMAGE_TAG` - Example: @@ -674,7 +674,7 @@ curl "http://httpstat.us/200" ### `post-domains-update` -- Description: Allows you to run commands once the domain for an application has been updated. It also sends in the command that has been used. This can be "add", "clear" or "remove". The third argument will be the optional list of domains +- Description: Allows you to run commands once the domain for an app has been updated. It also sends in the command that has been used. This can be "add", "clear" or "remove". The third argument will be the optional list of domains - Invoked by: `dokku domains:add`, `dokku domains:clear`, `dokku domains:remove`, `dokku domains:set` - Arguments: `$APP` `action name` `domains` - Example: @@ -691,7 +691,7 @@ sudo service haproxy reload ### `post-extract` -- Description: Allows you to modify the contents of an application *after* it has been extracted from git/tarball but *before* the image source type is detected. +- Description: Allows you to modify the contents of an app *after* it has been extracted from git/tarball but *before* the image source type is detected. - Invoked by: `dokku tar:in`, `dokku tar:from` and the `receive-app` plugin trigger - Arguments: `$APP` `$TMP_WORK_DIR` `$REV` - Example: @@ -713,7 +713,7 @@ echo "clock: some-command" >> Procfile ### `post-proxy-ports-update` -- Description: Allows you to run commands once the proxy port mappings for an application have been updated. It also sends the invoking command. This can be "add", "clear" or "remove". +- Description: Allows you to run commands once the proxy port mappings for an app have been updated. It also sends the invoking command. This can be "add", "clear" or "remove". - Invoked by: `dokku proxy:ports-add`, `dokku proxy:ports-clear`, `dokku proxy:ports-remove` - Arguments: `$APP` `action name` - Example: @@ -733,7 +733,7 @@ haproxy-build-config "$APP" ### `post-release-buildpack` -- Description: Allows you to run commands after environment variables are set for the release step of the deploy. Only applies to applications using buildpacks. +- Description: Allows you to run commands after environment variables are set for the release step of the deploy. Only applies to apps using buildpacks. - Invoked by: `internal function dokku_release() (release phase)` - Arguments: `$APP $IMAGE_TAG` - Example: @@ -760,7 +760,7 @@ docker commit $ID $IMAGE > /dev/null ### `post-release-dockerfile` -- Description: Allows you to run commands after environment variables are set for the release step of the deploy. Only applies to applications using a dockerfile. +- Description: Allows you to run commands after environment variables are set for the release step of the deploy. Only applies to apps using a dockerfile. - Invoked by: `internal function dokku_release() (release phase)` - Arguments: `$APP $IMAGE_TAG` - Example: @@ -778,14 +778,14 @@ verify_app_name "$APP" ### `post-stop` -- Description: Can be used to run commands after an application is manually stopped +- Description: Can be used to run commands after an app is manually stopped - Invoked by: `dokku ps:stop` and `dokku ps:stopall` - Arguments: `$APP` - Example: ```shell #!/usr/bin/env bash -# Marks an application as manually stopped +# Marks an app as manually stopped set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x @@ -796,7 +796,7 @@ dokku config:set --no-restart $APP MANUALLY_STOPPED=1 ### `pre-build-buildpack` -- Description: Allows you to run commands before the build image is created for a given app. For instance, this can be useful to add env vars to your container. Only applies to applications using buildpacks. +- Description: Allows you to run commands before the build image is created for a given app. For instance, this can be useful to add env vars to your container. Only applies to apps using buildpacks. - Invoked by: `internal function dokku_build() (build phase)` - Arguments: `$APP` - Example: @@ -811,7 +811,7 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x ### `pre-build-dockerfile` -- Description: Allows you to run commands before the build image is created for a given app. For instance, this can be useful to add env vars to your container. Only applies to applications using a dockerfile. +- Description: Allows you to run commands before the build image is created for a given app. For instance, this can be useful to add env vars to your container. Only applies to apps using a dockerfile. - Invoked by: `internal function dokku_build() (build phase)` - Arguments: `$APP` - Example: @@ -833,7 +833,7 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x ```shell #!/usr/bin/env bash -# Clears out the gulp asset build cache for applications +# Clears out the gulp asset build cache for apps set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" @@ -848,7 +848,7 @@ fi ### `pre-deploy` -- Description: Allows the running of code before the application's processes are scaled up and after the docker images are prepared. +- Description: Allows the running of code before the app's processes are scaled up and after the docker images are prepared. - Invoked by: `dokku deploy` - Arguments: `$APP $IMAGE_TAG` - Example: @@ -905,7 +905,7 @@ APP="$1"; verify_app_name "$APP" ### `pre-receive-app` -- Description: Allows you to customize the contents of an application directory before they are processed for deployment. The `IMAGE_SOURCE_TYPE` can be any of `[herokuish, dockerfile]` +- Description: Allows you to customize the contents of an app directory before they are processed for deployment. The `IMAGE_SOURCE_TYPE` can be any of `[herokuish, dockerfile]` - Invoked by: `dokku git-hook`, `dokku tar-build-locked` - Arguments: `$APP $IMAGE_SOURCE_TYPE $TMP_WORK_DIR $REV` - Example: @@ -913,7 +913,7 @@ APP="$1"; verify_app_name "$APP" ```shell #!/usr/bin/env bash # Adds a file called `dokku-is-awesome` to the repository -# the contents will be the application name +# the contents will be the app name set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x @@ -924,7 +924,7 @@ echo "$APP" > "$TMP_WORK_DIR/dokku-is-awesome" ### `pre-release-buildpack` -- Description: Allows you to run commands before environment variables are set for the release step of the deploy. Only applies to applications using buildpacks. +- Description: Allows you to run commands before environment variables are set for the release step of the deploy. Only applies to apps using buildpacks. - Invoked by: `internal function dokku_release() (release phase)` - Arguments: `$APP $IMAGE_TAG` - Example: @@ -951,7 +951,7 @@ docker commit $ID $IMAGE > /dev/null ### `pre-release-dockerfile` -- Description: Allows you to run commands before environment variables are set for the release step of the deploy. Only applies to applications using a dockerfile. +- Description: Allows you to run commands before environment variables are set for the release step of the deploy. Only applies to apps using a dockerfile. - Invoked by: `internal function dokku_release() (release phase)` - Arguments: `$APP $IMAGE_TAG` - Example: @@ -985,14 +985,14 @@ DOKKU_SCHEDULER="$1" ### `pre-start` -- Description: Can be used to run commands before an application is started +- Description: Can be used to run commands before an app is started - Invoked by: `dokku ps:start` - Arguments: `$APP` - Example: ```shell #!/usr/bin/env bash -# Notifies an example url that an application is starting +# Notifies an example url that an app is starting set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x @@ -1048,7 +1048,7 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x ### `receive-app` -- Description: Allows you to customize what occurs when an app is received. Normally just triggers an application build. +- Description: Allows you to customize what occurs when an app is received. Normally just triggers an app build. - Invoked by: `dokku git-hook`, `dokku ps:rebuild` - Arguments: `$APP $REV` (`$REV` may not be included in cases where a repository is not pushed) - Example: @@ -1222,7 +1222,7 @@ docker push $DOCKER_HUB_USER/$APP:$IMAGE_TAG ### `tags-destroy` -- Description: Allows you to run commands once a tag for an application image has been removed +- Description: Allows you to run commands once a tag for an app image has been removed - Invoked by: `dokku tags:destroy` - Arguments: `$APP $IMAGE_TAG` - Example: From 3ca8f3c3dc15fd4238d1601514aec1fa6f60c783 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 7 Apr 2018 00:21:06 -0400 Subject: [PATCH 25/25] docs: add documentation on the docker-local scheduler --- .../advanced-usage/schedulers/docker-local.md | 31 +++++++++++++++++++ docs/template.html | 4 +++ 2 files changed, 35 insertions(+) create mode 100644 docs/advanced-usage/schedulers/docker-local.md diff --git a/docs/advanced-usage/schedulers/docker-local.md b/docs/advanced-usage/schedulers/docker-local.md new file mode 100644 index 000000000..1427a0a97 --- /dev/null +++ b/docs/advanced-usage/schedulers/docker-local.md @@ -0,0 +1,31 @@ +# Docker Local Scheduler + +> New as of 0.12.0 + +Dokku natively includes functionality to manage application lifecycles for a single server using the `scheduler-docker-local` plugin. It is the default scheduler, but as with all schedulers, it is set on a per-application basis. The scheduler can currently be overridden by running the following command: + +```shell +dokku config:set node-js-app DOCKER_SCHEDULER=docker-local +``` + +As it is the default, unsetting the `DOCKER_SCHEDULER` config variable is also a valid way to reset the scheduler. + +```shell +dokku config:unset node-js-app DOCKER_SCHEDULER +``` + +## Implemented Triggers + +This plugin implements various functionality through `plugn` triggers to integrate with Docker for running apps on a single server. The following functionality is supported by the `scheduler-docker-local` plugin. + +- `check-deploy` +- `core-post-deploy` +- `post-delete` +- `pre-deploy` +- `pre-restore` +- `scheduler-deploy` +- `scheduler-docker-cleanup` +- `scheduler-run` +- `scheduler-stop` +- `scheduler-tags-create` +- `scheduler-tags-destroy` \ No newline at end of file diff --git a/docs/template.html b/docs/template.html index 6127425c7..7344344c8 100644 --- a/docs/template.html +++ b/docs/template.html @@ -158,6 +158,10 @@ Plugin Management Repository Management + Schedulers + + Docker Local + Development Plugin Creation