The shorthand is more prevalent in this codebase, and is something that bash supports, so we should just use the same thing everywhere. Note that we do not use shorthand redirect in Makefile as shell parsing is a bit different in Make and the shorthand redirect doesn't seem to be properly supported, causing CI errors.
71 lines
3.2 KiB
Bash
Executable File
71 lines
3.2 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"
|
|
|
|
trigger-scheduler-docker-local-core-post-deploy() {
|
|
declare desc="scheduler-docker-local core-post-deploy state cleanup"
|
|
declare trigger="core-post-deploy"
|
|
declare APP="$1"
|
|
local APP_ROOT="$DOKKU_ROOT/$APP"
|
|
|
|
local DOKKU_SCHEDULER=$(get_app_scheduler "$APP")
|
|
if [[ "$DOKKU_SCHEDULER" != "docker-local" ]]; then
|
|
return
|
|
fi
|
|
|
|
dokku_log_info1 "Renaming containers"
|
|
local PROCTYPES="$(plugn trigger ps-current-scale "$APP" | 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_verbose_quiet "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"
|
|
local CURRENT_CONTAINER_ID="$(<"$container")"
|
|
# TODO: Ensure these are from the current service
|
|
local PREVIOUS_CIDS=$("$DOCKER_BIN" container ls --all --quiet --filter name="^.?$NAME\$" | xargs) || true
|
|
if [[ -n $PREVIOUS_CIDS ]]; then
|
|
dokku_log_verbose_quiet "Found previous container(s) ($PREVIOUS_CIDS) named $NAME"
|
|
# in case $PREVIOUS_CIDS has more than one entry
|
|
local cid
|
|
for cid in $PREVIOUS_CIDS; do
|
|
local PREVIOUS_CONTAINER_STATUS=$("$DOCKER_BIN" container inspect --format '{{.State.Status}}' "$cid" || echo "dead")
|
|
# dead containers cannot be renamed
|
|
if [[ "$PREVIOUS_CONTAINER_STATUS" != "dead" ]]; then
|
|
local CONTAINER_DATE_NAME="$NAME.$(date +%s)"
|
|
dokku_log_verbose_quiet "Renaming container ($cid) ${NAME} to $CONTAINER_DATE_NAME"
|
|
"$DOCKER_BIN" container rename "$NAME" "$CONTAINER_DATE_NAME" &>/dev/null || dokku_log_warn "Unable to rename container"
|
|
fi
|
|
done
|
|
fi
|
|
local ID=$(cat "$container")
|
|
local CURRENT_NAME=$("$DOCKER_BIN" container inspect --format '{{.Name}}' "$ID" | tr -d /)
|
|
if [[ -n "$CURRENT_NAME" ]]; then
|
|
dokku_log_verbose_quiet "Renaming container $CURRENT_NAME (${ID:0:12}) to $NAME"
|
|
if ! "$DOCKER_BIN" container rename "$ID" "$NAME" >/dev/null; then
|
|
dokku_log_warn "Failed to rename container $CURRENT_NAME (${ID:0:12})"
|
|
dokku_log_info2_quiet "Start $APP (${ID:0:12}) container output:"
|
|
dokku_container_log_verbose_quiet "$ID"
|
|
dokku_log_info2_quiet "End $APP (${ID:0:12}) container output"
|
|
fi
|
|
fi
|
|
done
|
|
shopt -u nullglob
|
|
}
|
|
|
|
trigger-scheduler-docker-local-core-post-deploy "$@"
|