fix: 改用 sqlite3 原生工具做 schema 同步,替代不可靠的 prisma CLI 方案
This commit is contained in:
+1
-4
@@ -25,6 +25,7 @@ RUN npm run build
|
|||||||
FROM base AS runner
|
FROM base AS runner
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
|
RUN apk add --no-cache sqlite
|
||||||
RUN addgroup --system --gid 1001 nodejs
|
RUN addgroup --system --gid 1001 nodejs
|
||||||
RUN adduser --system --uid 1001 nextjs
|
RUN adduser --system --uid 1001 nextjs
|
||||||
|
|
||||||
@@ -35,10 +36,6 @@ COPY --from=builder /app/prisma/template.db ./template.db
|
|||||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||||||
|
|
||||||
# Prisma CLI + schema engine for automatic schema migration on startup
|
|
||||||
COPY --from=builder /app/node_modules/prisma ./node_modules/prisma
|
|
||||||
COPY --from=builder /app/node_modules/@prisma/engines ./node_modules/@prisma/engines
|
|
||||||
|
|
||||||
COPY docker-entrypoint.sh ./
|
COPY docker-entrypoint.sh ./
|
||||||
RUN chmod +x docker-entrypoint.sh
|
RUN chmod +x docker-entrypoint.sh
|
||||||
|
|
||||||
|
|||||||
+26
-5
@@ -1,15 +1,36 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
DB_PATH="/app/data/prod.db"
|
TEMPLATE="/app/template.db"
|
||||||
|
DB="/app/data/prod.db"
|
||||||
|
|
||||||
if [ ! -f "$DB_PATH" ]; then
|
if [ ! -f "$DB" ]; then
|
||||||
echo "[db] First run — creating database from template"
|
echo "[db] First run — creating database from template"
|
||||||
cp /app/template.db "$DB_PATH"
|
cp "$TEMPLATE" "$DB"
|
||||||
|
exec node server.js
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "[db] Syncing schema..."
|
echo "[db] Syncing schema..."
|
||||||
node ./node_modules/prisma/build/index.js db push --skip-generate --accept-data-loss 2>&1 || \
|
|
||||||
echo "[db] ⚠ Schema sync failed, starting with existing schema"
|
|
||||||
|
|
||||||
|
# 1) Create any new tables
|
||||||
|
sqlite3 "$TEMPLATE" ".schema" | \
|
||||||
|
sed 's/CREATE TABLE /CREATE TABLE IF NOT EXISTS /g' | \
|
||||||
|
sed 's/CREATE INDEX /CREATE INDEX IF NOT EXISTS /g' | \
|
||||||
|
sed 's/CREATE UNIQUE INDEX /CREATE UNIQUE INDEX IF NOT EXISTS /g' | \
|
||||||
|
sqlite3 "$DB" 2>/dev/null || true
|
||||||
|
|
||||||
|
# 2) Add missing columns to existing tables
|
||||||
|
for table in $(sqlite3 "$TEMPLATE" "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '_prisma%'"); do
|
||||||
|
prod_cols=$(sqlite3 "$DB" "PRAGMA table_info('$table')" 2>/dev/null | cut -d'|' -f2 || echo "")
|
||||||
|
|
||||||
|
sqlite3 "$TEMPLATE" "PRAGMA table_info('$table')" | while IFS='|' read -r _cid name type notnull dflt _pk; do
|
||||||
|
if ! echo "$prod_cols" | grep -qx "$name"; then
|
||||||
|
alter="ALTER TABLE \"$table\" ADD COLUMN \"$name\" $type"
|
||||||
|
[ -n "$dflt" ] && alter="$alter DEFAULT $dflt"
|
||||||
|
sqlite3 "$DB" "$alter" 2>/dev/null && echo "[db] + $table.$name" || true
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "[db] Schema sync complete"
|
||||||
exec node server.js
|
exec node server.js
|
||||||
|
|||||||
Reference in New Issue
Block a user