Dockerfile 部署
This commit is contained in:
@@ -5,7 +5,6 @@ ERP 登录模块 - DrissionPage
|
|||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
import datetime
|
import datetime
|
||||||
import tempfile
|
|
||||||
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
|
||||||
@@ -28,15 +27,14 @@ def is_docker_env() -> bool:
|
|||||||
return os.path.exists("/.dockerenv")
|
return os.path.exists("/.dockerenv")
|
||||||
|
|
||||||
|
|
||||||
def get_docker_user_data_dir() -> Path:
|
def get_docker_tmp_root() -> Path:
|
||||||
"""
|
"""
|
||||||
为每个进程分配独立的 Chromium 用户目录。
|
指定 DrissionPage 在 Docker 中的临时根目录。
|
||||||
多 worker 或异常重启后复用同一 profile,容易导致 DevTools 会话错乱。
|
auto_port() 会在该目录下自动创建独立端口和用户目录。
|
||||||
"""
|
"""
|
||||||
base_dir = Path(os.getenv("DRISSION_USER_DATA_ROOT", tempfile.gettempdir())) / "drission_profiles"
|
tmp_root = Path(os.getenv("DRISSION_TMP_ROOT", "/tmp")) / "DrissionPage"
|
||||||
user_data_dir = base_dir / f"worker_{os.getpid()}"
|
tmp_root.mkdir(parents=True, exist_ok=True)
|
||||||
user_data_dir.mkdir(parents=True, exist_ok=True)
|
return tmp_root
|
||||||
return user_data_dir
|
|
||||||
|
|
||||||
|
|
||||||
# ── 日志 ──────────────────────────────────────────────────────────────────────
|
# ── 日志 ──────────────────────────────────────────────────────────────────────
|
||||||
@@ -83,12 +81,11 @@ def get_page(headless: bool = False, port: int = 9222) -> ChromiumPage:
|
|||||||
co.set_argument("--window-size=1440,900")
|
co.set_argument("--window-size=1440,900")
|
||||||
|
|
||||||
if is_docker:
|
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)
|
co.auto_port(True)
|
||||||
# 为当前 worker 隔离 Chromium profile,防止多个进程共享 profile 导致握手错乱
|
log("INFO", f"Docker Drission 临时目录: {tmp_root}")
|
||||||
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 脚本调用的
|
# 很多 Debian/Ubuntu 系统的 Chromium 实际上是通过 wrapper 脚本调用的
|
||||||
# 直接指定确切的执行路径,防止 DrissionPage 底层启动失败
|
# 直接指定确切的执行路径,防止 DrissionPage 底层启动失败
|
||||||
if os.path.exists('/usr/bin/chromium'):
|
if os.path.exists('/usr/bin/chromium'):
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
- TZ=Asia/Shanghai
|
- TZ=Asia/Shanghai
|
||||||
- ENABLE_BACKGROUND_SCHEDULER=1
|
- ENABLE_BACKGROUND_SCHEDULER=1
|
||||||
- DRISSION_USER_DATA_ROOT=/tmp
|
- DRISSION_TMP_ROOT=/tmp
|
||||||
volumes:
|
volumes:
|
||||||
# 既然用 Git 拉取了完整代码,直接用相对路径挂载更优雅
|
# 既然用 Git 拉取了完整代码,直接用相对路径挂载更优雅
|
||||||
# 直接挂载整个 output 文件夹,里面的 erp_data.db 自动持久化
|
# 直接挂载整个 output 文件夹,里面的 erp_data.db 自动持久化
|
||||||
|
|||||||
Reference in New Issue
Block a user