diff --git a/docs/development/plugin-triggers.md b/docs/development/plugin-triggers.md index 54bc763cc..ef5372bb4 100644 --- a/docs/development/plugin-triggers.md +++ b/docs/development/plugin-triggers.md @@ -2169,14 +2169,14 @@ CONTAINER_ID="$2"; - Description: Allows you to run scheduler commands when containers should be force retired from the system - Invoked by: `dokku run` -- Arguments: `$DOKKU_SCHEDULER` +- Arguments: `$DOKKU_SCHEDULER $APP` - Example: ```shell #!/usr/bin/env bash set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x -DOKKU_SCHEDULER="$1"; +DOKKU_SCHEDULER="$1"; APP="$2"; # TODO ``` diff --git a/plugins/ps/src/subcommands/subcommands.go b/plugins/ps/src/subcommands/subcommands.go index b77b0d7ba..306daea8a 100644 --- a/plugins/ps/src/subcommands/subcommands.go +++ b/plugins/ps/src/subcommands/subcommands.go @@ -56,7 +56,8 @@ func main() { case "retire": args := flag.NewFlagSet("ps:retire", flag.ExitOnError) args.Parse(os.Args[2:]) - err = ps.CommandRetire() + appName := args.Arg(0) + err = ps.CommandRetire(appName) case "scale": args := flag.NewFlagSet("ps:scale", flag.ExitOnError) skipDeploy := args.Bool("skip-deploy", false, "--skip-deploy: skip deploy of the app") diff --git a/plugins/ps/subcommands.go b/plugins/ps/subcommands.go index 1ba4703d2..e34698733 100644 --- a/plugins/ps/subcommands.go +++ b/plugins/ps/subcommands.go @@ -93,9 +93,14 @@ func CommandRestore(appName string, allApps bool, parallelCount int) error { } // CommandRetire ensures old containers are retired -func CommandRetire() error { +func CommandRetire(appName string) error { lockFile := filepath.Join(common.MustGetEnv("DOKKU_LIB_ROOT"), "data", "ps", "retire") - scheduler := common.GetGlobalScheduler() + scheduler := "" + if appName == "" { + scheduler = common.GetGlobalScheduler() + } else { + scheduler = common.GetAppScheduler(appName) + } fileLock := flock.New(lockFile) locked, err := fileLock.TryLock() @@ -108,7 +113,8 @@ func CommandRetire() error { return fmt.Errorf("Failed to acquire ps:retire lock") } - if err := common.PlugnTrigger("scheduler-retire", []string{scheduler}...); err != nil { + common.LogInfo1("Retiring old containers and images") + if err := common.PlugnTrigger("scheduler-retire", []string{scheduler, appName}...); err != nil { return err } diff --git a/plugins/scheduler-docker-local/internal-functions b/plugins/scheduler-docker-local/internal-functions index d11e966fb..d8355137a 100755 --- a/plugins/scheduler-docker-local/internal-functions +++ b/plugins/scheduler-docker-local/internal-functions @@ -67,10 +67,10 @@ cmd-scheduler-docker-local-report-single() { } fn-scheduler-docker-local-retire-container() { - declare APP="$1" CID="$2" DEAD_TIME="$3" + declare APP="$1" CID="$2" local STATE - dokku_log_info1_quiet "Attempting to retire $APP container $CID" + dokku_log_verbose_quiet "Attempting to retire $APP container $CID" STATE="$("$DOCKER_BIN" container inspect --format "{{ .State.Status }}" "$CID" 2>/dev/null || true)" if [[ -z "$STATE" ]]; then return @@ -108,6 +108,7 @@ fn-scheduler-docker-local-retire-container() { fn-scheduler-docker-local-retire-containers() { local DEAD_CONTAINER_FILE="${DOKKU_LIB_ROOT}/data/scheduler-docker-local/dead-containers" local APP CID CURRENT_TIME DEAD_TIME STATE + declare SCHEDULER="$1" APP="$2" if [[ ! -f "$DEAD_CONTAINER_FILE" ]]; then return @@ -117,15 +118,19 @@ fn-scheduler-docker-local-retire-containers() { while read line; do [[ -z "$line" ]] && continue CURRENT_TIME="$(date +%s)" - APP="$(echo "$line" | cut -d ' ' -f1)" + RETIRE_APP="$(echo "$line" | cut -d ' ' -f1)" CID="$(echo "$line" | cut -d ' ' -f2)" DEAD_TIME="$(echo "$line" | cut -d ' ' -f3)" + if [[ -n "$APP" ]] && [[ "$APP" != "$RETIRE_APP" ]]; then + continue + fi + if [[ "$CURRENT_TIME" -le "$DEAD_TIME" ]]; then continue fi - fn-scheduler-docker-local-retire-container "$APP" "$CID" "$DEAD_TIME" + fn-scheduler-docker-local-retire-container "$RETIRE_APP" "$CID" STATE="$("$DOCKER_BIN" container inspect --format "{{ .State.Status }}" "$CID" 2>/dev/null || true)" if [[ -z "$STATE" ]]; then DEAD_CONTAINERS+=("$CID") @@ -154,6 +159,7 @@ fn-scheduler-docker-local-retire-containers() { fn-scheduler-docker-local-retire-images() { local DEAD_IMAGE_FILE="${DOKKU_LIB_ROOT}/data/scheduler-docker-local/dead-images" local APP IMAGE_ID CURRENT_TIME DEAD_TIME STATE RM_OUTPUT + declare SCHEDULER="$1" APP="$2" if [[ ! -f "$DEAD_IMAGE_FILE" ]]; then return @@ -163,10 +169,14 @@ fn-scheduler-docker-local-retire-images() { while read line; do [[ -z "$line" ]] && continue CURRENT_TIME="$(date +%s)" - APP="$(echo "$line" | cut -d ' ' -f1)" + RETIRE_APP="$(echo "$line" | cut -d ' ' -f1)" IMAGE_ID="$(echo "$line" | cut -d ' ' -f2)" DEAD_TIME="$(echo "$line" | cut -d ' ' -f3)" + if [[ -n "$APP" ]] && [[ "$APP" != "$RETIRE_APP" ]]; then + continue + fi + if [[ "$CURRENT_TIME" -le "$DEAD_TIME" ]]; then continue fi @@ -177,7 +187,7 @@ fn-scheduler-docker-local-retire-images() { continue fi - dokku_log_info1_quiet "Attempting to retire $APP image $IMAGE_ID" + dokku_log_verbose_quiet "Attempting to retire $RETIRE_APP image $IMAGE_ID" if RM_OUTPUT="$("$DOCKER_BIN" image rm "$IMAGE_ID" 2>&1)"; then DEAD_IMAGES+=("$IMAGE_ID") continue diff --git a/plugins/scheduler-docker-local/scheduler-retire b/plugins/scheduler-docker-local/scheduler-retire index cf469956b..8f4b274dd 100755 --- a/plugins/scheduler-docker-local/scheduler-retire +++ b/plugins/scheduler-docker-local/scheduler-retire @@ -7,9 +7,10 @@ source "$PLUGIN_AVAILABLE_PATH/scheduler-docker-local/internal-functions" trigger-scheduler-docker-local-scheduler-retire() { declare desc="retires all old containers once they have aged out" declare trigger="scheduler-retire" + declare SCHEDULER="$1" APP="$2" - fn-scheduler-docker-local-retire-containers - fn-scheduler-docker-local-retire-images + fn-scheduler-docker-local-retire-containers "$SCHEDULER" "$APP" + fn-scheduler-docker-local-retire-images "$SCHEDULER" "$APP" } trigger-scheduler-docker-local-scheduler-retire "$@"