You've already forked pruchase_jhw
69 lines
2.5 KiB
Docker
69 lines
2.5 KiB
Docker
# syntax=docker/dockerfile:1
|
|
# 基础镜像版本必须与 uv.lock 中的 playwright 版本一致(当前 1.60.0),
|
|
# 浏览器二进制与系统依赖已预装在 /ms-playwright。
|
|
FROM mcr.microsoft.com/playwright/python:v1.60.0-noble
|
|
|
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
|
|
# X 虚拟桌面 + VNC/noVNC + 录屏/截图/图像匹配运行依赖 + 日文字体 + 进程编排
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
xvfb \
|
|
fluxbox \
|
|
x11vnc \
|
|
novnc \
|
|
websockify \
|
|
ffmpeg \
|
|
scrot \
|
|
libgl1 \
|
|
fonts-noto-cjk \
|
|
supervisor \
|
|
curl \
|
|
tzdata \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/
|
|
|
|
WORKDIR /app
|
|
|
|
# 私有 PyPI 索引(git.jerryyan.net)若需要认证,构建时传入:
|
|
# docker build --build-arg UV_INDEX_JERRYYAN_USERNAME=xxx --build-arg UV_INDEX_JERRYYAN_PASSWORD=xxx .
|
|
ARG UV_INDEX_JERRYYAN_USERNAME
|
|
ARG UV_INDEX_JERRYYAN_PASSWORD
|
|
|
|
# 依赖层缓存:仅复制依赖清单后同步,源码变更不触发依赖重装
|
|
COPY pyproject.toml uv.lock ./
|
|
RUN --mount=type=cache,target=/root/.cache/uv uv sync --frozen --no-dev
|
|
|
|
COPY src ./src
|
|
COPY resources ./resources
|
|
COPY .env.prod ./.env.prod
|
|
|
|
# 容器配置模板:运行时若挂载的 /app/config 中无 accounts.yaml,entrypoint 会用它初始化
|
|
COPY deploy/config/accounts.yaml /app/deploy-defaults/accounts.yaml
|
|
|
|
COPY docker/supervisord.conf /etc/supervisor/supervisord.conf
|
|
COPY docker/entrypoint.sh /entrypoint.sh
|
|
# 防御 Windows 仓库 CRLF 换行导致脚本无法执行
|
|
RUN sed -i 's/\r$//' /entrypoint.sh && chmod +x /entrypoint.sh
|
|
|
|
ENV APP_ENV=prod \
|
|
TZ=Asia/Shanghai \
|
|
DISPLAY=:99 \
|
|
SCREEN_RES=1920x1080x24 \
|
|
ACCOUNTS_CONFIG_PATH=/app/config/accounts.yaml \
|
|
PYTHONUNBUFFERED=1
|
|
|
|
# 关键数据声明为卷(兜底):即使 docker run 时未显式挂载,
|
|
# 浏览器登录态(accounts 的 user_data_dir 父目录)与账号配置也会落入匿名卷持久化。
|
|
# accounts.yaml 中每个账号的 user_data_dir 都应指向 /app/chrome-profile/ 下的子目录。
|
|
VOLUME ["/app/chrome-profile", "/app/config"]
|
|
|
|
# 6080: noVNC web | 5900: 原生 VNC | 8080: 截图/账号配置 API
|
|
EXPOSE 5900 6080 8080
|
|
|
|
# 启动需等待 Xvfb + 浏览器预热 + API 拉起
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=120s --retries=3 \
|
|
CMD curl -fs "http://localhost:8080/api/screenshots?days=1" > /dev/null || exit 1
|
|
|
|
ENTRYPOINT ["/entrypoint.sh"]
|