Dockerfile 部署
This commit is contained in:
@@ -5,6 +5,7 @@ ERP 登录模块 - DrissionPage
|
||||
import os
|
||||
import time
|
||||
import datetime
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
from dotenv import load_dotenv
|
||||
from DrissionPage import ChromiumPage, ChromiumOptions
|
||||
@@ -22,6 +23,22 @@ ERP_USERNAME = os.getenv("ERP_USERNAME", "")
|
||||
ERP_PASSWORD = os.getenv("ERP_PASSWORD", "")
|
||||
|
||||
|
||||
def is_docker_env() -> bool:
|
||||
"""判断当前是否运行在 Docker 容器中。"""
|
||||
return os.path.exists("/.dockerenv")
|
||||
|
||||
|
||||
def get_docker_user_data_dir() -> Path:
|
||||
"""
|
||||
为每个进程分配独立的 Chromium 用户目录。
|
||||
多 worker 或异常重启后复用同一 profile,容易导致 DevTools 会话错乱。
|
||||
"""
|
||||
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
|
||||
|
||||
|
||||
# ── 日志 ──────────────────────────────────────────────────────────────────────
|
||||
def log(level: str, msg: str):
|
||||
icons = {"INFO": "ℹ️ ", "OK": "✅", "WARN": "⚠️ ", "ERR": "❌"}
|
||||
@@ -47,7 +64,7 @@ def dump_page_state(page: ChromiumPage, label: str = ""):
|
||||
def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage:
|
||||
co = ChromiumOptions()
|
||||
# 强制在生产环境下使用无头模式
|
||||
is_docker = os.path.exists('/.dockerenv')
|
||||
is_docker = is_docker_env()
|
||||
|
||||
if headless or is_docker:
|
||||
co.set_argument("--headless=new")
|
||||
@@ -68,6 +85,10 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage:
|
||||
if is_docker:
|
||||
# Docker 生产环境:每次启动分配随机端口,避免前一个僵尸进程占用导致 404
|
||||
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}")
|
||||
# 很多 Debian/Ubuntu 系统的 Chromium 实际上是通过 wrapper 脚本调用的
|
||||
# 直接指定确切的执行路径,防止 DrissionPage 底层启动失败
|
||||
if os.path.exists('/usr/bin/chromium'):
|
||||
|
||||
Reference in New Issue
Block a user