- sync-docker-prep.sh: add MindLyst, LysnrAI, talk2obsidian to consumer list
- docker-doctor.sh: detect Python Dockerfiles (python:3.x base) and skip
Node-specific checks (pnpm/corepack, .npmrc.docker ARGs). Python base
images are now in the approved list alongside node:22-{alpine,slim}.
Refs: docker-build-optimization-roadmap.md \xc2\xa7 D
112 lines
3.0 KiB
Bash
Executable File
112 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Sync canonical docker-prep.template.sh into every product repo's scripts/docker-prep.sh.
|
|
# Mirrors scripts/sync-npmrc.sh pattern.
|
|
#
|
|
# Usage:
|
|
# bash scripts/sync-docker-prep.sh # sync all known consumers
|
|
# bash scripts/sync-docker-prep.sh --check # exit 1 if any drift
|
|
# bash scripts/sync-docker-prep.sh --repo PATH # sync just one repo
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
TEMPLATE="$SCRIPT_DIR/docker-prep.template.sh"
|
|
COMMON_PLAT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
SIBLING_ROOT="$(cd "$COMMON_PLAT/.." && pwd)"
|
|
|
|
CHECK_ONLY=false
|
|
SINGLE_REPO=""
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
--check) CHECK_ONLY=true ;;
|
|
--repo) SINGLE_REPO="${2:-}"; shift ;;
|
|
-h|--help) sed -n '2,11p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
|
|
*) echo "Unknown arg: $1" >&2; exit 2 ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ ! -f "$TEMPLATE" ]; then
|
|
echo "✗ Template not found: $TEMPLATE" >&2; exit 1
|
|
fi
|
|
|
|
# Repos that consume docker-prep.sh (have scripts/docker-prep.sh today)
|
|
CONSUMERS=(
|
|
"learning_ai_clock"
|
|
"learning_ai_peakpulse"
|
|
"learning_ai_notes"
|
|
"learning_ai_fastgap"
|
|
"learning_ai_jarvis_jr"
|
|
"learning_ai_flowmonk"
|
|
"learning_ai_trails"
|
|
"learning_ai_local_memory_gpt"
|
|
"learning_ai_efforise"
|
|
"learning_multimodal_memory_agents"
|
|
"learning_voice_ai_agent"
|
|
"learning_ai_talk2obsidian"
|
|
)
|
|
|
|
if [ -n "$SINGLE_REPO" ]; then
|
|
CONSUMERS=("$(basename "$SINGLE_REPO")")
|
|
SIBLING_ROOT="$(cd "$(dirname "$SINGLE_REPO")" && pwd)"
|
|
fi
|
|
|
|
drift=0
|
|
synced=0
|
|
skipped=0
|
|
|
|
for repo in "${CONSUMERS[@]}"; do
|
|
target_dir="$SIBLING_ROOT/$repo"
|
|
target="$target_dir/scripts/docker-prep.sh"
|
|
if [ ! -d "$target_dir" ]; then
|
|
echo " ⊘ skip $repo (not present at $target_dir)"
|
|
skipped=$((skipped+1))
|
|
continue
|
|
fi
|
|
if [ ! -f "$target" ]; then
|
|
echo " ⊘ skip $repo (no existing scripts/docker-prep.sh)"
|
|
skipped=$((skipped+1))
|
|
continue
|
|
fi
|
|
|
|
# Sync 3 files together: main script + 2 JS helpers
|
|
HELPER_INJECT="$SCRIPT_DIR/_docker-prep-inject.js"
|
|
HELPER_STRIP="$SCRIPT_DIR/_docker-prep-strip.js"
|
|
T_HELPER_INJECT="$(dirname "$target")/_docker-prep-inject.js"
|
|
T_HELPER_STRIP="$(dirname "$target")/_docker-prep-strip.js"
|
|
|
|
in_sync=true
|
|
cmp -s "$TEMPLATE" "$target" || in_sync=false
|
|
cmp -s "$HELPER_INJECT" "$T_HELPER_INJECT" 2>/dev/null || in_sync=false
|
|
cmp -s "$HELPER_STRIP" "$T_HELPER_STRIP" 2>/dev/null || in_sync=false
|
|
|
|
if $in_sync; then
|
|
echo " ✓ $repo (in sync)"
|
|
continue
|
|
fi
|
|
|
|
if $CHECK_ONLY; then
|
|
echo " ✗ $repo DRIFT"
|
|
drift=$((drift+1))
|
|
else
|
|
mkdir -p "$(dirname "$target")"
|
|
cp "$TEMPLATE" "$target"
|
|
cp "$HELPER_INJECT" "$T_HELPER_INJECT"
|
|
cp "$HELPER_STRIP" "$T_HELPER_STRIP"
|
|
chmod +x "$target"
|
|
echo " ↺ $repo synced (script + 2 helpers)"
|
|
synced=$((synced+1))
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
if $CHECK_ONLY; then
|
|
if [ $drift -gt 0 ]; then
|
|
echo "❌ $drift repo(s) drifted from canonical template"
|
|
exit 1
|
|
fi
|
|
echo "✅ All repos in sync with canonical docker-prep template"
|
|
else
|
|
echo "✅ Synced: $synced, skipped: $skipped"
|
|
fi
|