mirror of
https://github.com/dokku/dokku.git
synced 2025-12-29 00:25:08 +01:00
271 lines
6.6 KiB
Bash
Executable File
271 lines
6.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -eo pipefail
|
|
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
|
|
[[ $DOKKU_TRACE ]] && set -x
|
|
|
|
fn-run() {
|
|
declare desc="runs command in container"
|
|
declare CMD="$1"
|
|
shift 1
|
|
|
|
declare APP=""
|
|
local CRON_ID CONCURRENCY_POLICY="allow" DOKKU_RUN_TTL_SECONDS="86400"
|
|
declare -a RUN_ENV
|
|
RUN_ENV=()
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--cron-id=*)
|
|
local arg=$(printf "%s" "$1" | sed -E 's/(^--cron-id=)//g')
|
|
CRON_ID="$arg"
|
|
shift
|
|
;;
|
|
--concurrency-policy=*)
|
|
local arg=$(printf "%s" "$1" | sed -E 's/(^--concurrency-policy=)//g')
|
|
CONCURRENCY_POLICY="$arg"
|
|
shift
|
|
;;
|
|
--no-tty)
|
|
export DOKKU_DISABLE_TTY=true
|
|
shift
|
|
;;
|
|
--force-tty)
|
|
export DOKKU_FORCE_TTY=true
|
|
shift
|
|
;;
|
|
--cron-id)
|
|
if [[ ! $2 ]]; then
|
|
dokku_log_warn "expected $1 to have an argument"
|
|
break
|
|
fi
|
|
CRON_ID="$2"
|
|
shift 2
|
|
;;
|
|
--concurrency-policy)
|
|
if [[ ! $2 ]]; then
|
|
dokku_log_warn "expected $1 to have an argument"
|
|
break
|
|
fi
|
|
CONCURRENCY_POLICY="$2"
|
|
shift 2
|
|
;;
|
|
-e=* | --env=*)
|
|
local arg=$(printf "%s" "$1" | sed -E 's/(^-e=)|(^--env=)//g')
|
|
RUN_ENV+=("$arg")
|
|
shift
|
|
;;
|
|
-e | --env)
|
|
if [[ ! $2 ]]; then
|
|
dokku_log_warn "expected $1 to have an argument"
|
|
break
|
|
fi
|
|
RUN_ENV+=("$2")
|
|
shift 2
|
|
;;
|
|
--ttl-seconds=*)
|
|
local arg=$(printf "%s" "$1" | sed -E 's/(^--ttl-seconds=)//g')
|
|
DOKKU_RUN_TTL_SECONDS="$arg"
|
|
shift
|
|
;;
|
|
--ttl-seconds)
|
|
if [[ ! $2 ]]; then
|
|
dokku_log_warn "expected $1 to have an argument"
|
|
break
|
|
fi
|
|
DOKKU_RUN_TTL_SECONDS="$2"
|
|
shift 2
|
|
;;
|
|
*)
|
|
APP="$1"
|
|
shift
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ -z "$DOKKU_RUN_TTL_SECONDS" ]]; then
|
|
DOKKU_RUN_TTL_SECONDS="86400"
|
|
fi
|
|
|
|
if [[ "$CMD" == "run:detached" ]] && [[ "$DOKKU_FORCE_TTY" != "true" ]]; then
|
|
export DOKKU_DISABLE_TTY=true
|
|
fi
|
|
|
|
if [[ "$DOKKU_DISABLE_TTY" == "true" ]] && [[ "$DOKKU_FORCE_TTY" == "true" ]]; then
|
|
dokku_log_fail "Cannot specify both --force-tty and --no-tty"
|
|
fi
|
|
|
|
verify_app_name "$APP"
|
|
|
|
local DOKKU_SCHEDULER=$(get_app_scheduler "$APP")
|
|
DOKKU_CRON_ID="$CRON_ID" DOKKU_CONCURRENCY_POLICY="$CONCURRENCY_POLICY" DOKKU_RUN_TTL_SECONDS="$DOKKU_RUN_TTL_SECONDS" plugn trigger scheduler-run "$DOKKU_SCHEDULER" "$APP" "${#RUN_ENV[@]}" "${RUN_ENV[@]}" -- "$@"
|
|
}
|
|
|
|
cmd-run() {
|
|
declare desc="runs command in container based on app image"
|
|
declare cmd="run"
|
|
[[ "$1" == "$cmd" ]] && shift 1
|
|
|
|
export DOKKU_RM_CONTAINER=1
|
|
fn-run "$cmd" "$@"
|
|
}
|
|
|
|
cmd-run-detached() {
|
|
declare desc="run a detached container"
|
|
declare cmd="run:detached"
|
|
[[ "$1" == "$cmd" ]] && shift 1
|
|
|
|
export DOKKU_DETACH_CONTAINER=1
|
|
export DOKKU_RM_CONTAINER=1
|
|
fn-run "$cmd" "$@"
|
|
}
|
|
|
|
cmd-run-list() {
|
|
declare desc="list all run containers for an app"
|
|
declare cmd="run:list"
|
|
[[ "$1" == "$cmd" ]] && shift 1
|
|
declare APP=""
|
|
local FORMAT="stdout"
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--format=*)
|
|
local arg=$(printf "%s" "$1" | sed -E 's/(^--format=)//g')
|
|
FORMAT="$arg"
|
|
shift
|
|
;;
|
|
--format)
|
|
if [[ ! $2 ]]; then
|
|
dokku_log_warn "expected $1 to have an argument"
|
|
break
|
|
fi
|
|
FORMAT="$2"
|
|
shift 2
|
|
;;
|
|
--quiet)
|
|
export DOKKU_QUIET_OUTPUT=true
|
|
shift
|
|
;;
|
|
*)
|
|
APP="$1"
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
verify_app_name "$APP"
|
|
local DOKKU_SCHEDULER=$(get_app_scheduler "$APP")
|
|
plugn trigger scheduler-run-list "$DOKKU_SCHEDULER" "$APP" "$FORMAT"
|
|
}
|
|
|
|
cmd-run-logs() {
|
|
declare desc="display recent log output"
|
|
declare cmd="run:logs"
|
|
[[ "$1" == "$cmd" ]] && shift 1
|
|
declare APP=""
|
|
|
|
local CONTAINER_NAME="" NUM="100" PRETTY_PRINT=false TAIL=false
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--container=*)
|
|
local arg=$(printf "%s" "$1" | sed -E 's/(^--container=)//g')
|
|
CONTAINER_NAME="$arg"
|
|
shift
|
|
;;
|
|
--container)
|
|
if [[ ! $2 ]]; then
|
|
dokku_log_warn "expected $1 to have an argument"
|
|
break
|
|
fi
|
|
CONTAINER_NAME="$2"
|
|
shift 2
|
|
;;
|
|
-n | --num)
|
|
local NUM="$2"
|
|
shift 2
|
|
;;
|
|
-q | --quiet)
|
|
local PRETTY_PRINT=true
|
|
shift
|
|
;;
|
|
-t | --tail)
|
|
local TAIL=true
|
|
shift
|
|
;;
|
|
*)
|
|
APP="$1"
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ -z "$APP" ]] && [[ -z "$CONTAINER_NAME" ]]; then
|
|
dokku_log_fail "No container or app specified"
|
|
fi
|
|
|
|
if [[ -n "$CONTAINER_NAME" ]]; then
|
|
if [[ "$(echo "$CONTAINER_NAME" | grep -o '\.' | wc -l)" -ne 2 ]]; then
|
|
dokku_log_fail "Invalid container name specified: $CONTAINER_NAME"
|
|
fi
|
|
|
|
if [[ -n "$APP" ]] && [[ "$APP" != "$(echo "$CONTAINER_NAME" | cut -d'.' -f1)" ]]; then
|
|
dokku_log_fail "Specified app does not app in container name"
|
|
fi
|
|
|
|
APP="$(echo "$CONTAINER_NAME" | cut -d'.' -f1)"
|
|
if [[ "$(echo "$CONTAINER_NAME" | cut -d'.' -f2)" != "run" ]]; then
|
|
dokku_log_fail "Specified container must be a run container"
|
|
fi
|
|
fi
|
|
|
|
verify_app_name "$APP"
|
|
DOKKU_SCHEDULER=$(get_app_scheduler "$APP")
|
|
plugn trigger scheduler-run-logs "$DOKKU_SCHEDULER" "$APP" "$CONTAINER_NAME" "$TAIL" "$PRETTY_PRINT" "$NUM"
|
|
}
|
|
|
|
cmd-run-retire() {
|
|
declare desc="stop all run containers that have exceeded their active deadline"
|
|
declare cmd="run:retire"
|
|
[[ "$1" == "$cmd" ]] && shift 1
|
|
declare APP="$1"
|
|
|
|
if [[ -z "$APP" ]]; then
|
|
plugn trigger scheduler-run-retire
|
|
else
|
|
verify_app_name "$APP"
|
|
local DOKKU_SCHEDULER="$(get_app_scheduler "$APP")"
|
|
plugn trigger scheduler-run-retire "$DOKKU_SCHEDULER" "$APP"
|
|
fi
|
|
}
|
|
|
|
cmd-run-stop() {
|
|
declare desc="stops all run containers for an app or a specified run container"
|
|
declare cmd="run:stop"
|
|
[[ "$1" == "$cmd" ]] && shift 1
|
|
declare APP CONTAINER_NAME
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--container=*)
|
|
local arg=$(printf "%s" "$1" | sed -E 's/(^--container=)//g')
|
|
CONTAINER_NAME="$arg"
|
|
shift
|
|
;;
|
|
--container)
|
|
if [[ ! $2 ]]; then
|
|
dokku_log_warn "expected $1 to have an argument"
|
|
break
|
|
fi
|
|
CONTAINER_NAME="$2"
|
|
shift 2
|
|
;;
|
|
*)
|
|
APP="$1"
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
local DOKKU_SCHEDULER=$(get_app_scheduler "$APP")
|
|
plugn trigger scheduler-run-stop "$DOKKU_SCHEDULER" "$APP" "$CONTAINER_NAME"
|
|
}
|