diff --git a/experimental/base-tools/scripts/svc/configure-startup.sh b/experimental/base-tools/scripts/svc/configure-startup.sh index 864fb095..a9cbe72d 100644 --- a/experimental/base-tools/scripts/svc/configure-startup.sh +++ b/experimental/base-tools/scripts/svc/configure-startup.sh @@ -3,24 +3,31 @@ set -euo pipefail # Source some common functions and variables BASE_TOOLS_DIR=${BASE_TOOLS_DIR:-/opt/base-tools} ROOT_DIR=$BASE_TOOLS_DIR/scripts/svc +STARTUP_SCRIPTS_DIR=${STARTUP_SCRIPTS_DIR:-/usr/start} source $ROOT_DIR/common.sh # Setup s6 service for startup.sh S6_DIR=/etc/s6-overlay/s6-rc.d mkdir -p "$S6_DIR" # startup oneshot referencing existing script mkdir -p "$S6_DIR/startup" "$S6_DIR/startup/dependencies.d" +cp "$ROOT_DIR/handle-startup.sh" "$S6_DIR/startup/handle-startup.sh" +# Copy default start up scripts to STARTUP_SCRIPTS_DIR +# These scripts should exit quickly to prevent delaying container startup +mkdir -p "$STARTUP_SCRIPTS_DIR" +shopt -s nullglob +startup_items=("$ROOT_DIR"/startup/*) +if [ ${#startup_items[@]} -gt 0 ]; then + chmod +x "${startup_items[@]}" + cp -r "${startup_items[@]}" "$STARTUP_SCRIPTS_DIR/" +fi +shopt -u nullglob # Create run first (idempotent overwrite) cat >"$S6_DIR/startup/run" <<'STARTUP' -#!/usr/bin/env bash +#!/command/with-contenv bash set -euo pipefail - -if [ -n "${SEALOS_DEVBOX_NAME:-}" ]; then - echo "${SEALOS_DEVBOX_NAME}" > /etc/hostname -fi -mkdir -p /usr/start -if [ -n "${SEALOS_DEVBOX_POD_UID:-}" ]; then - echo "${SEALOS_DEVBOX_POD_UID}" > /usr/start/pod_id -fi +SOURCE_DIR=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") +chmod +x "$SOURCE_DIR/handle-startup.sh" +"$SOURCE_DIR/handle-startup.sh" STARTUP echo oneshot >"$S6_DIR/startup/type" echo '/etc/s6-overlay/s6-rc.d/startup/run' >"$S6_DIR/startup/up" diff --git a/experimental/base-tools/scripts/svc/handle-startup.sh b/experimental/base-tools/scripts/svc/handle-startup.sh new file mode 100644 index 00000000..a9b9b60b --- /dev/null +++ b/experimental/base-tools/scripts/svc/handle-startup.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -euo pipefail + +STARTUP_SCRIPTS_DIR=${STARTUP_SCRIPTS_DIR:-/usr/start} + +# Exit quietly if the directory is missing or empty +if [ ! -d "$STARTUP_SCRIPTS_DIR" ]; then + exit 0 +fi + +mapfile -t STARTUP_SCRIPTS < <(find "$STARTUP_SCRIPTS_DIR" -type f -executable -print | sort) + +if [ ${#STARTUP_SCRIPTS[@]} -eq 0 ]; then + exit 0 +fi + +# Run each startup program sequentially in lexical order for deterministic behavior +# IMPORTANT: These programs should exit quickly to avoid delaying container startup +run_startup_script() { + local script="$1" + echo "Running startup script: $script" >&2 + if ! "$script"; then + echo "Startup script failed: $script" >&2 + exit 1 + fi +} + +for script in "${STARTUP_SCRIPTS[@]}"; do + run_startup_script "$script" +done diff --git a/experimental/base-tools/scripts/svc/startup/00-set-hostname.sh b/experimental/base-tools/scripts/svc/startup/00-set-hostname.sh new file mode 100644 index 00000000..861a0ea5 --- /dev/null +++ b/experimental/base-tools/scripts/svc/startup/00-set-hostname.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -euo pipefail +if [ -n "${SEALOS_DEVBOX_NAME:-}" ]; then + echo "${SEALOS_DEVBOX_NAME}" > /etc/hostname + chmod 644 /etc/hostname +fi \ No newline at end of file diff --git a/experimental/base-tools/scripts/svc/startup/01-set-pod-id.sh b/experimental/base-tools/scripts/svc/startup/01-set-pod-id.sh new file mode 100644 index 00000000..5f06f9f9 --- /dev/null +++ b/experimental/base-tools/scripts/svc/startup/01-set-pod-id.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -euo pipefail +mkdir -p /usr/start +if [ -n "${SEALOS_DEVBOX_POD_UID:-}" ]; then + echo "${SEALOS_DEVBOX_POD_UID}" > /usr/start/pod_id + chmod 644 /usr/start/pod_id +fi \ No newline at end of file