mirror of
https://github.com/dokku/dokku.git
synced 2026-02-24 04:00:36 +01:00
When rebooting a Dokku host the init process tries to restore all apps using `dokku ps:restore`, alphabetically. If an app is defined but not deployed, the function `ps_start` called by `dokku ps:restore` will exit 0 and stop trying to restore the other apps later in the alphabet. This change fixes the restore behaviour.
167 lines
5.4 KiB
Bash
Executable File
167 lines
5.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
|
|
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
|
|
source "$PLUGIN_AVAILABLE_PATH/config/functions"
|
|
|
|
print_dokku_scale_file() {
|
|
declare desc="prints contents of DOKKU_SCALE file"
|
|
local APP="$1"; local DOKKU_SCALE_FILE="$DOKKU_ROOT/$APP/DOKKU_SCALE"
|
|
while read -r line || [[ -n "$line" ]]; do
|
|
dokku_log_info2_quiet "$line"
|
|
done < "$DOKKU_SCALE_FILE"
|
|
}
|
|
|
|
extract_procfile() {
|
|
declare desc="extracts procfile from app image"
|
|
local APP="$1"
|
|
local IMAGE_TAG="$(get_running_image_tag "$APP")"
|
|
local IMAGE="$(get_app_image_name "$APP" "$IMAGE_TAG")"
|
|
local DOKKU_PROCFILE="$DOKKU_ROOT/$APP/DOKKU_PROCFILE"
|
|
verify_app_name "$APP"
|
|
|
|
copy_from_image "$IMAGE" "Procfile" "$DOKKU_PROCFILE" 2>/dev/null || true
|
|
if [[ -f "$DOKKU_PROCFILE" ]]; then
|
|
dokku_log_info1_quiet "App Procfile file found ($DOKKU_PROCFILE)"
|
|
else
|
|
dokku_log_info1_quiet "No Procfile found in app image"
|
|
fi
|
|
}
|
|
|
|
remove_procfile() {
|
|
declare desc="removes DOKKU_PROCFILE"
|
|
local APP="$1"; local DOKKU_PROCFILE="$DOKKU_ROOT/$APP/DOKKU_PROCFILE"
|
|
if [[ -f "$DOKKU_PROCFILE" ]]; then
|
|
rm -f "$DOKKU_PROCFILE"
|
|
fi
|
|
}
|
|
|
|
generate_scale_file() {
|
|
declare desc="generates DOKKU_SCALE file"
|
|
local APP="$1"; local IMAGE_TAG="$2"; local IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG"); local DOKKU_SCALE_FILE="$DOKKU_ROOT/$APP/DOKKU_SCALE"
|
|
local DOKKU_PROCFILE="$DOKKU_ROOT/$APP/DOKKU_PROCFILE"
|
|
verify_app_name "$APP"
|
|
|
|
copy_from_image "$IMAGE" "/app/DOKKU_SCALE" "$DOKKU_ROOT/$APP" 2>/dev/null || true
|
|
if [[ ! -f $DOKKU_SCALE_FILE ]]; then
|
|
dokku_log_info1_quiet "DOKKU_SCALE file not found in app image. Generating one based on Procfile..."
|
|
|
|
local GENERATE_SCALE_FILE_TMP_WORK_DIR=$(mktemp -d "/tmp/dokku_scale.XXXX")
|
|
trap 'rm -rf "$GENERATE_SCALE_FILE_TMP_WORK_DIR" > /dev/null' RETURN
|
|
|
|
if [[ -f $DOKKU_PROCFILE ]]; then
|
|
while read -r line || [[ -n "$line" ]]; do
|
|
if [[ -z "$line" ]] || [[ "$line" == "#"* ]]; then
|
|
continue
|
|
fi
|
|
local NAME=${line%%:*}
|
|
local NUM_PROCS=0
|
|
[[ "$NAME" == "web" ]] && NUM_PROCS=1
|
|
[[ -n "$NAME" ]] && echo "$NAME=$NUM_PROCS" >> "$DOKKU_SCALE_FILE"
|
|
done < "$DOKKU_PROCFILE"
|
|
else
|
|
echo "web=1" >> "$DOKKU_SCALE_FILE"
|
|
fi
|
|
dokku_log_info1_quiet "New DOKKU_SCALE file generated"
|
|
else
|
|
dokku_log_info1_quiet "DOKKU_SCALE file found ($DOKKU_SCALE_FILE)"
|
|
fi
|
|
print_dokku_scale_file "$APP"
|
|
}
|
|
|
|
set_scale() {
|
|
declare desc="sets app proc type scaling"
|
|
local APP="$1"; local DOKKU_SCALE_FILE="$DOKKU_ROOT/$APP/DOKKU_SCALE"
|
|
shift 1
|
|
local SCALE_SETTINGS=("$@")
|
|
for procscale in "${SCALE_SETTINGS[@]}"; do
|
|
local PROC_NAME=${procscale%%=*}
|
|
local PROC_COUNT=${procscale#*=}
|
|
is_number $PROC_COUNT || dokku_log_fail "ps:scale $PROC_COUNT is not a number"
|
|
dokku_log_info1_quiet "Scaling $APP:$PROC_NAME to $PROC_COUNT"
|
|
if (egrep -q ^${PROC_NAME}= "$DOKKU_SCALE_FILE" > /dev/null 2>&1); then
|
|
sed --in-place "s:^${PROC_NAME}=.*:$PROC_NAME=$PROC_COUNT:g" "$DOKKU_SCALE_FILE"
|
|
else
|
|
echo "$PROC_NAME=$PROC_COUNT" >> "$DOKKU_SCALE_FILE"
|
|
fi
|
|
done
|
|
}
|
|
|
|
ps_start() {
|
|
declare desc="starts app"
|
|
local APP="$1"; verify_app_name "$APP"
|
|
local IMAGE_TAG=$(get_running_image_tag "$APP");
|
|
|
|
if (is_deployed "$APP"); then
|
|
if ! (is_app_running "$APP"); then
|
|
release_and_deploy "$APP" "$IMAGE_TAG"
|
|
else
|
|
echo "App $APP already running"
|
|
fi
|
|
else
|
|
echo "App $APP has not been deployed"
|
|
fi
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
ps_rebuild() {
|
|
declare desc="rebuilds app from base image"
|
|
local APP="$1"; verify_app_name "$APP"
|
|
|
|
plugn trigger receive-app "$APP"
|
|
}
|
|
|
|
ps_restart() {
|
|
declare desc="restarts app"
|
|
local APP="$1"; verify_app_name "$APP"
|
|
local IMAGE_TAG=$(get_running_image_tag "$APP")
|
|
|
|
if is_deployed "$APP"; then
|
|
release_and_deploy "$APP" "$IMAGE_TAG"
|
|
else
|
|
echo "App $APP has not been deployed"
|
|
fi
|
|
}
|
|
|
|
ps_scale() {
|
|
declare desc="sets app scaling config according arguments; otherwise according to DOKKU_SCALE file"
|
|
local APP="$1"; verify_app_name "$APP"
|
|
local IMAGE_TAG=$(get_running_image_tag "$APP")
|
|
local DOKKU_SCALE_FILE="$DOKKU_ROOT/$APP/DOKKU_SCALE"
|
|
shift 1
|
|
|
|
[[ ! -e $DOKKU_SCALE_FILE ]] && generate_scale_file "$APP" "$IMAGE_TAG"
|
|
if [[ -z "$@" ]];then
|
|
dokku_log_info1_quiet "Scaling for $APP"
|
|
dokku_col_log_info1_quiet "proctype" "qty"
|
|
dokku_col_log_info1_quiet "--------" "---"
|
|
while read -r line || [[ -n "$line" ]]; do
|
|
[[ -z "$line" ]] && continue
|
|
local PROC_NAME=${line%%=*}
|
|
local PROC_COUNT=${line#*=}
|
|
dokku_col_log_info1 "$PROC_NAME" "$PROC_COUNT"
|
|
done < "$DOKKU_SCALE_FILE"
|
|
else
|
|
set_scale "$APP" "$@"
|
|
release_and_deploy "$APP" "$IMAGE_TAG"
|
|
fi
|
|
}
|