Looknicemm commited on
Commit
e7e5a85
·
verified ·
1 Parent(s): a66b0f1

fix(entrypoint): FUSE-safe chmod/mkdir so /app/data bucket mount cannot crash boot

Browse files
Files changed (1) hide show
  1. docker-entrypoint.sh +76 -74
docker-entrypoint.sh CHANGED
@@ -1,74 +1,76 @@
1
- #!/bin/bash
2
- set -e
3
-
4
- # 清理残留锁文件并启动虚拟显示器
5
- rm -f /tmp/.X99-lock
6
- Xvfb :99 -screen 0 1280x800x24 &
7
- export DISPLAY=:99
8
-
9
- # 确保数据目录存在且可写
10
- mkdir -p /app/data /app/data/auths /app/data/screenshots
11
- chmod -R 777 /app/data
12
-
13
- # 数据文件:无条件软链到 data/(确保所有写入都持久化)
14
- for f in .env accounts.json state.json; do
15
- # data 里没有就创建空文件
16
- [ -f "/app/data/$f" ] || touch "/app/data/$f"
17
- # 删除容器内的真实文件(如果不是软链),然后建软链
18
- rm -f "/app/$f"
19
- ln -s "/app/data/$f" "/app/$f"
20
- done
21
-
22
- # 目录软链
23
- for d in auths screenshots; do
24
- rm -rf "/app/$d"
25
- ln -s "/app/data/$d" "/app/$d"
26
- done
27
-
28
- # ---------------------------------------------------------------------------
29
- # Self-check: 关键 import 白名单 — 失败即 crash-loop(SPEC-3 §2)
30
- # ---------------------------------------------------------------------------
31
- echo "[self-check] verifying critical imports..."
32
- if ! uv run python - <<'PYEOF'
33
- import sys
34
-
35
- # 核心 web 应用入口
36
- from autoteam.api import app # noqa: F401
37
-
38
- # accounts.py 全部对外契约符号(典型 typo 高发区)
39
- from autoteam.accounts import ( # noqa: F401
40
- load_accounts,
41
- save_accounts,
42
- STATUS_ACTIVE,
43
- STATUS_EXHAUSTED,
44
- STATUS_STANDBY,
45
- STATUS_PENDING,
46
- STATUS_PERSONAL,
47
- STATUS_AUTH_INVALID,
48
- STATUS_ORPHAN,
49
- )
50
-
51
- # manager → accounts 链路(覆盖跨模块 typo)
52
- from autoteam.manager import sync_account_states # noqa: F401
53
-
54
- # 0515 runtime hardening helpers
55
- from autoteam.runtime_resources import collect_runtime_resource_snapshot # noqa: F401
56
- from autoteam.playwright_lifecycle import close_playwright_objects # noqa: F401
57
- from autoteam.playwright_probe import main as playwright_probe_main # noqa: F401
58
- from autoteam.chatgpt_transport import build_chatgpt_transport # noqa: F401
59
-
60
- print("[self-check] OK: %d critical symbols imported." % 15)
61
- sys.exit(0)
62
- PYEOF
63
- then
64
- echo "[self-check] FATAL: critical import failed - image is likely stale or broken." >&2
65
- echo "[self-check] If you just pulled new code, the image must be rebuilt:" >&2
66
- echo "[self-check] docker compose down" >&2
67
- echo "[self-check] docker compose build --no-cache --build-arg GIT_SHA=\$(git rev-parse --short HEAD)" >&2
68
- echo "[self-check] docker compose up -d" >&2
69
- exit 1
70
- fi
71
- echo "[self-check] passed."
72
-
73
- # 执行命令
74
- exec uv run autoteam "$@"
 
 
 
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ # 清理残留锁文件并启动虚拟显示器
5
+ rm -f /tmp/.X99-lock
6
+ Xvfb :99 -screen 0 1280x800x24 &
7
+ export DISPLAY=:99
8
+
9
+ # 确保数据目录存在且可写
10
+ # 注意: /app/data 可能是 HF bucket(FUSE) 挂载点。FUSE 不一定支持 chmod,
11
+ # 在 `set -e` 下未加保护的 chmod 失败会让容器崩溃 crash-loop,故用 `|| true` 兜底。
12
+ mkdir -p /app/data /app/data/auths /app/data/screenshots 2>/dev/null || true
13
+ chmod -R 777 /app/data 2>/dev/null || true
14
+
15
+ # 数据文件:无条件软链到 data/(确保所有写入都持久化)
16
+ for f in .env accounts.json state.json; do
17
+ # data 里没有就创建空文件
18
+ [ -f "/app/data/$f" ] || touch "/app/data/$f"
19
+ # 删除容器内的真实文件(如果不是软链),然后建软链
20
+ rm -f "/app/$f"
21
+ ln -s "/app/data/$f" "/app/$f"
22
+ done
23
+
24
+ # 目录软链
25
+ for d in auths screenshots; do
26
+ rm -rf "/app/$d"
27
+ ln -s "/app/data/$d" "/app/$d"
28
+ done
29
+
30
+ # ---------------------------------------------------------------------------
31
+ # Self-check: 关键 import 白名单 — 失败即 crash-loop(SPEC-3 §2)
32
+ # ---------------------------------------------------------------------------
33
+ echo "[self-check] verifying critical imports..."
34
+ if ! uv run python - <<'PYEOF'
35
+ import sys
36
+
37
+ # 核心 web 应用入口
38
+ from autoteam.api import app # noqa: F401
39
+
40
+ # accounts.py 全部对外契约符号(典型 typo 高发区)
41
+ from autoteam.accounts import ( # noqa: F401
42
+ load_accounts,
43
+ save_accounts,
44
+ STATUS_ACTIVE,
45
+ STATUS_EXHAUSTED,
46
+ STATUS_STANDBY,
47
+ STATUS_PENDING,
48
+ STATUS_PERSONAL,
49
+ STATUS_AUTH_INVALID,
50
+ STATUS_ORPHAN,
51
+ )
52
+
53
+ # manager → accounts 链路(覆盖跨模块 typo)
54
+ from autoteam.manager import sync_account_states # noqa: F401
55
+
56
+ # 0515 runtime hardening helpers
57
+ from autoteam.runtime_resources import collect_runtime_resource_snapshot # noqa: F401
58
+ from autoteam.playwright_lifecycle import close_playwright_objects # noqa: F401
59
+ from autoteam.playwright_probe import main as playwright_probe_main # noqa: F401
60
+ from autoteam.chatgpt_transport import build_chatgpt_transport # noqa: F401
61
+
62
+ print("[self-check] OK: %d critical symbols imported." % 15)
63
+ sys.exit(0)
64
+ PYEOF
65
+ then
66
+ echo "[self-check] FATAL: critical import failed - image is likely stale or broken." >&2
67
+ echo "[self-check] If you just pulled new code, the image must be rebuilt:" >&2
68
+ echo "[self-check] docker compose down" >&2
69
+ echo "[self-check] docker compose build --no-cache --build-arg GIT_SHA=\$(git rev-parse --short HEAD)" >&2
70
+ echo "[self-check] docker compose up -d" >&2
71
+ exit 1
72
+ fi
73
+ echo "[self-check] passed."
74
+
75
+ # 执行命令
76
+ exec uv run autoteam "$@"