mirror of
https://github.com/dokku/dokku.git
synced 2025-12-29 00:25:08 +01:00
74 lines
2.8 KiB
Bash
Executable File
74 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
|
|
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
|
|
|
|
get_phase_script() {
|
|
declare desc="extracts app.json from app image and returns the appropriate json key/value"
|
|
local IMAGE="$1"; local PHASE_SCRIPT_KEY="$2"
|
|
local GET_PHASE_SCRIPT_TMP_WORK_DIR=$(mktemp -d "/tmp/dokku_get_phase_script.XXXX")
|
|
local APP_JSON_FILE="$GET_PHASE_SCRIPT_TMP_WORK_DIR/app.json"
|
|
trap 'rm -rf "$GET_PHASE_SCRIPT_TMP_WORK_DIR" > /dev/null' RETURN INT TERM
|
|
|
|
copy_from_image "$IMAGE" "/app/app.json" "$GET_PHASE_SCRIPT_TMP_WORK_DIR" 2>/dev/null || true
|
|
|
|
if [[ -f "$APP_JSON_FILE" ]];then
|
|
local VALUE=$(get_json_value "scripts.dokku.${PHASE_SCRIPT_KEY}" < "$APP_JSON_FILE")
|
|
else
|
|
return 0
|
|
fi
|
|
|
|
echo "$VALUE"
|
|
}
|
|
|
|
execute_script() {
|
|
declare desc="executes appropriate phase script key from app.json"
|
|
local APP="$1"; local IMAGE="$2"; local PHASE_SCRIPT_KEY="$3"
|
|
local SCRIPT_CMD=$(get_phase_script "$IMAGE" "$PHASE_SCRIPT_KEY" 2>/dev/null)
|
|
if [[ -n "$SCRIPT_CMD" ]];then
|
|
dokku_log_info1 "Running '$SCRIPT_CMD' in app container"
|
|
local COMMAND="export HOME=/app ; "
|
|
local COMMAND+=" cd \$HOME ; "
|
|
local COMMAND+=" for file in /app/.profile.d/*; do source \$file; done ; "
|
|
local COMMAND+=" echo restoring installation cache... ; "
|
|
local COMMAND+=" rm -rf /tmp/cache || true ; "
|
|
local COMMAND+=" ln -sf /cache /tmp/cache || true ; "
|
|
local COMMAND+=" $SCRIPT_CMD ; RC=\$? ;"
|
|
local COMMAND+=" echo removing installation cache... ; "
|
|
local COMMAND+=" rm -f /tmp/cache || true ; "
|
|
local COMMAND+=" exit \$RC "
|
|
local DOCKER_ARGS=$(: | plugn trigger docker-args-deploy "$APP")
|
|
local CACHE_DIR="$DOKKU_ROOT/$APP/cache"
|
|
# shellcheck disable=SC2086
|
|
local id=$(docker run "$DOKKU_GLOBAL_RUN_ARGS" --label=dokku_phase_script="${PHASE_SCRIPT_KEY}" -d -v "$CACHE_DIR:/cache" $DOCKER_ARGS "$IMAGE" /bin/bash -c "$COMMAND")
|
|
test "$(docker wait "$id")" -eq 0 || (dokku_container_log_verbose_quiet "$id"; exit 1)
|
|
dokku_container_log_verbose_quiet "$id"
|
|
if [[ "$PHASE_SCRIPT_KEY" != "postdeploy" ]];then
|
|
docker commit "$id" "$IMAGE" > /dev/null
|
|
fi
|
|
fi
|
|
}
|
|
|
|
exec_app_json_scripts() {
|
|
declare desc="core app.json scripts execution"
|
|
local trigger="$0 app_json_scripts"
|
|
local APP="$1"
|
|
|
|
case "$0" in
|
|
*pre-deploy)
|
|
local IMAGE_TAG="$2"
|
|
local IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG")
|
|
local PHASE_SCRIPT_KEY="predeploy"
|
|
;;
|
|
*post-deploy)
|
|
local IMAGE_TAG="$4"
|
|
local IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG")
|
|
local PHASE_SCRIPT_KEY="postdeploy"
|
|
;;
|
|
esac
|
|
|
|
dokku_log_info1 "Attempting to run scripts.dokku.$PHASE_SCRIPT_KEY from app.json (if defined)"
|
|
execute_script "$APP" "$IMAGE" "$PHASE_SCRIPT_KEY"
|
|
}
|
|
|
|
exec_app_json_scripts "$@"
|