From 145f31d4c100504fa212102cd3ec627e2b99c5ca Mon Sep 17 00:00:00 2001 From: hjq <770690987@qq.com> Date: Fri, 12 Jun 2026 17:29:48 +0800 Subject: [PATCH] =?UTF-8?q?Dockerfile=20=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- browser_login/login.py | 23 ++++++++++------------- docker-compose.yml | 2 +- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/browser_login/login.py b/browser_login/login.py index 2e781d5..2f11d9f 100644 --- a/browser_login/login.py +++ b/browser_login/login.py @@ -5,7 +5,6 @@ ERP 登录模块 - DrissionPage import os import time import datetime -import tempfile from pathlib import Path from dotenv import load_dotenv from DrissionPage import ChromiumPage, ChromiumOptions @@ -28,15 +27,14 @@ def is_docker_env() -> bool: return os.path.exists("/.dockerenv") -def get_docker_user_data_dir() -> Path: +def get_docker_tmp_root() -> Path: """ - 为每个进程分配独立的 Chromium 用户目录。 - 多 worker 或异常重启后复用同一 profile,容易导致 DevTools 会话错乱。 + 指定 DrissionPage 在 Docker 中的临时根目录。 + auto_port() 会在该目录下自动创建独立端口和用户目录。 """ - base_dir = Path(os.getenv("DRISSION_USER_DATA_ROOT", tempfile.gettempdir())) / "drission_profiles" - user_data_dir = base_dir / f"worker_{os.getpid()}" - user_data_dir.mkdir(parents=True, exist_ok=True) - return user_data_dir + tmp_root = Path(os.getenv("DRISSION_TMP_ROOT", "/tmp")) / "DrissionPage" + tmp_root.mkdir(parents=True, exist_ok=True) + return tmp_root # ── 日志 ────────────────────────────────────────────────────────────────────── @@ -83,12 +81,11 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage: co.set_argument("--window-size=1440,900") if is_docker: - # Docker 生产环境:每次启动分配随机端口,避免前一个僵尸进程占用导致 404 + # Docker 生产环境:由 DrissionPage 自动分配独立端口和 profile,避免僵尸会话导致 404 + tmp_root = get_docker_tmp_root() + co.set_tmp_path(str(tmp_root)) co.auto_port(True) - # 为当前 worker 隔离 Chromium profile,防止多个进程共享 profile 导致握手错乱 - user_data_dir = get_docker_user_data_dir() - co.set_user_data_path(str(user_data_dir)) - log("INFO", f"Docker Chromium 用户目录: {user_data_dir}") + log("INFO", f"Docker Drission 临时目录: {tmp_root}") # 很多 Debian/Ubuntu 系统的 Chromium 实际上是通过 wrapper 脚本调用的 # 直接指定确切的执行路径,防止 DrissionPage 底层启动失败 if os.path.exists('/usr/bin/chromium'): diff --git a/docker-compose.yml b/docker-compose.yml index 78ae2a2..21e2f21 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,7 @@ services: environment: - TZ=Asia/Shanghai - ENABLE_BACKGROUND_SCHEDULER=1 - - DRISSION_USER_DATA_ROOT=/tmp + - DRISSION_TMP_ROOT=/tmp volumes: # 既然用 Git 拉取了完整代码,直接用相对路径挂载更优雅 # 直接挂载整个 output 文件夹,里面的 erp_data.db 自动持久化