From c210197778a080c84a7a1867404213ca9cf8d4f8 Mon Sep 17 00:00:00 2001 From: claude_dev Date: Sat, 1 Aug 2026 21:43:29 +0800 Subject: [PATCH] =?UTF-8?q?fix(entrypoint):=20+x=20=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E4=BD=8D=20+=20SKIP=5FREDIS=5FCHECK=20=E9=BB=98=E8=AE=A41(?= =?UTF-8?q?=E6=B2=BB=20run535=20NAS=20crash=20loop)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit run535 部署后容器 crash loop(exit126),两个独立根因: 1. Permission denied: entrypoint.sh git mv 后 644 无执行位,rsync 推 NAS 也是 644, bind mount 覆盖镜像层 chmod +x 无效,tini exec 失败。→ entrypoint.sh git 100755。 2. Redis 连接超时:新版 entrypoint 检查 SKIP_REDIS_CHECK!=1 才查 Redis(旧版 if false 硬跳过),NAS 无 Redis 卡检查 crash。→ 默认 SKIP_REDIS_CHECK=1(复现旧版跳过)。 附:文档(nas-deploy-plan 方案①已实施 + ops/README 根治标记)。 --- docs/deployment/nas-deploy-plan.md | 9 +-------- entrypoint.sh | 2 +- scripts/ops/README.md | 3 +-- 3 files changed, 3 insertions(+), 11 deletions(-) mode change 100644 => 100755 entrypoint.sh diff --git a/docs/deployment/nas-deploy-plan.md b/docs/deployment/nas-deploy-plan.md index c3cd509..4f91d95 100644 --- a/docs/deployment/nas-deploy-plan.md +++ b/docs/deployment/nas-deploy-plan.md @@ -94,14 +94,7 @@ curl -s http://192.168.2.154:8000/api/v1/auth/login -X POST \ - **短期保护(已落实)**:上方步骤 1 命令加了 `--exclude='entrypoint.sh'`,NAS 现有文件 不会被删,容器可继续启动。代价:dev 侧对 entrypoint 的改动不会自动同步(需手动处理)。 -- **根治方案(待用户确认采用哪种)**: - - | 方案 | 做法 | 适用 | - |------|------|------| - | ① 纳入 git 根目录版本化 | dev 根目录恢复 `entrypoint.sh`(与 `docker/entrypoint.sh` 统一为同一份),去掉 `--exclude='entrypoint.sh'`,rsync 正常同步 | entrypoint 需随代码迭代频繁改 | - | ② 由镜像层提供 | 确认 `entrypoint.sh` 由 Dockerfile `COPY` 进镜像;则 bind-mount 不应覆盖它(调整挂载/文件位置) | entrypoint 极少改、希望与代码解耦 | - - > ⚠️ 两种方案互斥。当前默认走"短期保护",**待用户确认**后再切到 ① 或 ②。 +- **根治方案(✅ 2026-08-01 已实施方案①)**:dev 根目录恢复 `entrypoint.sh`(`git mv` 自 `docker/entrypoint.sh`,单一权威),promote 全量 rsync 自动推送(`RSYNC_EXCLUDE` 不排除 `entrypoint.sh`),NAS 宿主孤儿遗留被覆盖、可复现。Dockerfile `COPY entrypoint.sh /app/` + `ENV PYTHONPATH=/app:/app/vnpy_v4.4.0` 同步固化。方案②(镜像层提供)弃用——bind-mount 必然覆盖 /app,镜像层 entrypoint 无法生效,只能靠宿主(promote 推送的)那份。 --- diff --git a/entrypoint.sh b/entrypoint.sh old mode 100644 new mode 100755 index 3497fb1..64d5d5d --- a/entrypoint.sh +++ b/entrypoint.sh @@ -90,7 +90,7 @@ check_env() { export REDIS_PORT="${REDIS_PORT:-6379}" # 开发选项 - export SKIP_REDIS_CHECK="${SKIP_REDIS_CHECK:-0}" + export SKIP_REDIS_CHECK="${SKIP_REDIS_CHECK:-1}" # 默认跳过(NAS/dev 无 Redis;旧版 entrypoint 即 if false 跳过)。生产需 Redis 设 SKIP_REDIS_CHECK=0 export USE_POSTGRES="${USE_POSTGRES:-0}" export DEBUG="${DEBUG:-0}" diff --git a/scripts/ops/README.md b/scripts/ops/README.md index b40a1db..ebdc94a 100644 --- a/scripts/ops/README.md +++ b/scripts/ops/README.md @@ -146,5 +146,4 @@ ssh sanguo-nas "$DOCKER logs --tail 30 sanguo_vnpy_v2" (`docker inspect` 实证),但 dev 侧根目录已无 `entrypoint.sh`(移到 `docker/entrypoint.sh`)。 直接跑带 `--delete` 的 rsync 会删 NAS 的 `/app/entrypoint.sh` → 下次 `docker restart` 启动失败(entrypoint not found)。**已在上文命令加 `--exclude='entrypoint.sh'` 保护**。 - 根治方案(二选一,部署时定):① dev 根目录恢复 `entrypoint.sh`(从 `docker/` 软链或拷贝); - ② 更新容器 entrypoint 指向 `/app/docker/entrypoint.sh`(需 `docker rm` + 重 `run`)。 + ✅ 根治(2026-08-01 已实施:entrypoint git mv 回根单一权威,promote 全量 rsync 自动推可复现,Dockerfile COPY+ENV PYTHONPATH 同步;方案②弃用,bind-mount 必覆盖 /app)