Bläddra i källkod

fix: 修复 Docker 启动时 SQLite 无法打开数据库文件的问题

- 添加 entrypoint 脚本,启动时修复挂载 volume 的权限后再切换到 nextjs 用户
- 显式复制 better-sqlite3 native 模块到生产镜像,防止 standalone 输出遗漏

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
zhangchunrui 1 vecka sedan
förälder
incheckning
fb7d2c6628
2 ändrade filer med 17 tillägg och 2 borttagningar
  1. 13 2
      Dockerfile
  2. 4 0
      docker-entrypoint.sh

+ 13 - 2
Dockerfile

@@ -23,6 +23,9 @@ WORKDIR /app
 ENV NODE_ENV=production
 ENV NEXT_TELEMETRY_DISABLED=1
 
+# Install su-exec for dropping privileges in entrypoint
+RUN apk add --no-cache su-exec
+
 # Create non-root user
 RUN addgroup --system --gid 1001 nodejs && \
     adduser --system --uid 1001 nextjs
@@ -35,14 +38,22 @@ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
 # Copy CLMM SDK dist (native requires)
 COPY --from=builder /app/src/lib/clmm-sdk/dist ./src/lib/clmm-sdk/dist
 
+# Copy better-sqlite3 native addon (standalone may miss it)
+COPY --from=builder /app/node_modules/better-sqlite3 ./node_modules/better-sqlite3
+COPY --from=builder /app/node_modules/bindings ./node_modules/bindings
+COPY --from=builder /app/node_modules/file-uri-to-path ./node_modules/file-uri-to-path
+
 # Data directory for SQLite
 RUN mkdir -p /app/data && chown nextjs:nodejs /app/data
 VOLUME /app/data
 
-USER nextjs
+# Entrypoint to fix volume permissions then drop to nextjs user
+COPY docker-entrypoint.sh /usr/local/bin/
+RUN chmod +x /usr/local/bin/docker-entrypoint.sh
+
 EXPOSE 3000
 
 ENV HOSTNAME=0.0.0.0
 ENV PORT=3000
 
-CMD ["node", "server.js"]
+ENTRYPOINT ["docker-entrypoint.sh"]

+ 4 - 0
docker-entrypoint.sh

@@ -0,0 +1,4 @@
+#!/bin/sh
+# Fix data directory permissions for mounted volumes
+chown -R nextjs:nodejs /app/data 2>/dev/null || true
+exec su-exec nextjs node server.js