Dockerfile 部署
This commit is contained in:
@@ -5,9 +5,11 @@ ERP 登录模块 - DrissionPage
|
|||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
import datetime
|
import datetime
|
||||||
|
import urllib.request
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from DrissionPage import ChromiumPage, ChromiumOptions
|
from DrissionPage import ChromiumPage, ChromiumOptions
|
||||||
|
from DrissionPage._base.chromium import handle_options
|
||||||
|
|
||||||
# ── 加载 .env ─────────────────────────────────────────────────────────────────
|
# ── 加载 .env ─────────────────────────────────────────────────────────────────
|
||||||
load_dotenv(Path(__file__).parent / ".env")
|
load_dotenv(Path(__file__).parent / ".env")
|
||||||
@@ -98,10 +100,42 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage:
|
|||||||
# 本地开发环境:使用固定端口,方便复用
|
# 本地开发环境:使用固定端口,方便复用
|
||||||
co.set_local_port(port)
|
co.set_local_port(port)
|
||||||
|
|
||||||
|
# #region debug-point A:drission-target
|
||||||
|
opt = handle_options(co)
|
||||||
|
log(
|
||||||
|
"INFO",
|
||||||
|
"[DEBUG] Chromium 连接参数: "
|
||||||
|
f"address={opt.address or '<empty>'}, "
|
||||||
|
f"browser_path={opt.browser_path or '<auto>'}, "
|
||||||
|
f"auto_port={opt.is_auto_port}, "
|
||||||
|
f"headless={opt.is_headless}, "
|
||||||
|
f"user_data_path={getattr(opt, 'user_data_path', '') or '<auto>'}"
|
||||||
|
)
|
||||||
|
log(
|
||||||
|
"INFO",
|
||||||
|
"[DEBUG] Chromium 启动参数: "
|
||||||
|
+ " | ".join(opt.arguments)
|
||||||
|
)
|
||||||
|
# #endregion
|
||||||
|
|
||||||
try:
|
try:
|
||||||
page = ChromiumPage(co)
|
page = ChromiumPage(opt)
|
||||||
return page
|
return page
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
# #region debug-point B:devtools-http-probe
|
||||||
|
if opt.address:
|
||||||
|
for endpoint in ("json/version", "json/list"):
|
||||||
|
url = f"http://{opt.address}/{endpoint}"
|
||||||
|
try:
|
||||||
|
with urllib.request.urlopen(url, timeout=2) as resp:
|
||||||
|
body = resp.read().decode("utf-8", errors="replace")
|
||||||
|
log("WARN", f"[DEBUG] DevTools 探测 {url} -> HTTP {resp.status}")
|
||||||
|
log("WARN", f"[DEBUG] DevTools 响应体 {endpoint}: {body[:1000]}")
|
||||||
|
except Exception as probe_err:
|
||||||
|
log("WARN", f"[DEBUG] DevTools 探测失败 {url}: {probe_err}")
|
||||||
|
else:
|
||||||
|
log("WARN", "[DEBUG] DevTools 探测跳过:address 为空")
|
||||||
|
# #endregion
|
||||||
log("ERR", f"浏览器初始化失败: {e}")
|
log("ERR", f"浏览器初始化失败: {e}")
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|||||||
29
debug-docker-chromium-404.md
Normal file
29
debug-docker-chromium-404.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# [OPEN] docker-chromium-404
|
||||||
|
|
||||||
|
## 症状
|
||||||
|
- Docker 生产环境中,发料单明细增量同步启动浏览器后报错:`Handshake status 404 Not Found`
|
||||||
|
|
||||||
|
## 当前现象
|
||||||
|
- 已确认不是多 worker 竞争导致的旧症状。
|
||||||
|
- 已确认 `DrissionPage` 在 Docker 中进入了自动端口模式。
|
||||||
|
- 当前需要采集 Chromium 实际调试地址、`/json/version` 返回内容、以及握手前的连接目标。
|
||||||
|
|
||||||
|
## 初始假设
|
||||||
|
- 假设 1:Chromium 虽然启动了,但 DevTools HTTP 接口没有真正暴露在 `127.0.0.1:<port>`。
|
||||||
|
- 假设 2:Chromium 暴露的并不是标准 DevTools Browser WebSocket 地址,DrissionPage 连到了错误的 ws 路径。
|
||||||
|
- 假设 3:容器内存在反向代理/网关拦截,导致本地调试端口请求拿到 HTML 404 页面。
|
||||||
|
- 假设 4:当前 Chromium 启动参数与 Debian slim 镜像内核能力不兼容,浏览器进程启动不完整但未直接抛出更明确异常。
|
||||||
|
- 假设 5:DrissionPage 在当前版本下对 Docker 中的 `headless=new` 或自动端口流程存在兼容性问题。
|
||||||
|
|
||||||
|
## 计划
|
||||||
|
- 第一步:只加调试插桩,不改业务逻辑。
|
||||||
|
- 第二步:让用户在 Docker 中复现,回收调试日志。
|
||||||
|
- 第三步:根据证据确认根因后,再做最小修复。
|
||||||
|
|
||||||
|
## 已完成
|
||||||
|
- 已在 `browser_login/login.py` 的 `get_page()` 增加调试插桩。
|
||||||
|
- 插桩会输出:
|
||||||
|
- DrissionPage 最终计算的 `address`
|
||||||
|
- Chromium 实际 `browser_path`
|
||||||
|
- 启动参数列表
|
||||||
|
- 握手失败后对 `http://<address>/json/version` 与 `http://<address>/json/list` 的探测结果
|
||||||
Reference in New Issue
Block a user