diff --git a/docs/checks-examples.md b/docs/checks-examples.md index 4dc169c83..0a034355f 100644 --- a/docs/checks-examples.md +++ b/docs/checks-examples.md @@ -277,3 +277,10 @@ To dokku@dokku.example.com:myapp ! [remote rejected] dokku -> master (pre-receive hook declined) error: failed to push some refs to 'dokku@dokku.example.com:myapp' ```` + +### Configuring docker stop timeout + +[By default](https://docs.docker.com/engine/reference/commandline/stop/), docker will wait 10 seconds from the time the `stop` command is passed to a container before it attempts to kill said container. This timeout can be configured on a per-app basis in dokku by setting the `DOKKU_DOCKER_STOP_TIMEOUT` configuration variable. This timeout applies to normal zero-downtime deployments as well as the `ps:stop` and `apps:destroy` commands. +``` +$ dokku config:set $APP DOKKU_DOCKER_STOP_TIMEOUT=20 +``` diff --git a/plugins/00_dokku-standard/subcommands/deploy b/plugins/00_dokku-standard/subcommands/deploy index ae7ed612c..307e98143 100755 --- a/plugins/00_dokku-standard/subcommands/deploy +++ b/plugins/00_dokku-standard/subcommands/deploy @@ -143,6 +143,8 @@ dokku_deploy_cmd() { for oldid in $oldids; do dokku_log_info2 "$oldid" done + 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}" ( exec >/dev/null 2>/dev/null /dev/null || true + # shellcheck disable=SC2086 + docker stop $DOCKER_STOP_TIME_ARG "$cid" > /dev/null || true docker rm "$cid" > /dev/null || true done fi diff --git a/plugins/ps/functions b/plugins/ps/functions index caad8b3c4..4573d2f07 100755 --- a/plugins/ps/functions +++ b/plugins/ps/functions @@ -1,6 +1,7 @@ #!/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" @@ -107,9 +108,12 @@ ps_stop() { ! (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 $DOKKU_APP_RUNNING_CONTAINER_IDS > /dev/null || true + 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"