From b552f1e56719f7fa703d5d14b81043edd4385903 Mon Sep 17 00:00:00 2001 From: liuwenxin <1009266660@qq.com> Date: Tue, 3 Nov 2026 17:18:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E9=83=A8=E7=BD=B2):=20=E5=B0=86=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E8=BF=81=E7=A7=BB=20SQL=20=E6=89=93=E5=8C=85=E5=88=B0?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=E9=95=9C=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit V28 迁移运行时需要读取 db/migration,补齐镜像复制与构建白名单。 同时保留后端镜像使用的周期检查入口。 --- .dockerignore | 35 ++++++++++++++++++++++++++++++ backend/Dockerfile | 43 +++++++++++++++++++++++++++++++++++++ docker/tplus-maintenance.sh | 23 ++++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 .dockerignore create mode 100644 backend/Dockerfile create mode 100644 docker/tplus-maintenance.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..802e631 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,35 @@ +# 构建上下文白名单,防止本地配置、客户资料和虚拟环境被发送到构建器。 +** +!backend/ +!backend/Dockerfile +!backend/pyproject.toml +!backend/uv.lock +!backend/.python-version +!backend/alembic.ini +!backend/app/ +!backend/app/** +!backend/alembic/ +!backend/alembic/** +!db/ +!db/migration/ +!db/migration/** +!db/queries/ +!db/queries/tplus/ +!db/queries/tplus/** +!frontend/ +!frontend/Dockerfile +!frontend/package.json +!frontend/pnpm-lock.yaml +!frontend/index.html +!frontend/tsconfig*.json +!frontend/vite.config.ts +!frontend/.env.production +!frontend/src/ +!frontend/src/** +!frontend/public/ +!frontend/public/** +!docker/ +!docker/nginx.prod.conf +!docker/tplus-maintenance.sh +**/__pycache__ +**/*.pyc diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..59440e1 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,43 @@ +# 从仓库根目录构建:docker build -f backend/Dockerfile -t ys-payroll-backend:release . +FROM ghcr.io/astral-sh/uv:0.12.13 AS uv +FROM python:3.12-slim-bookworm + +ENV TZ=Asia/Shanghai \ + PYTHONUNBUFFERED=1 \ + PYTHONDONTWRITEBYTECODE=1 \ + UV_LINK_MODE=copy \ + UV_PYTHON_DOWNLOADS=never \ + PATH="/app/backend/.venv/bin:$PATH" + +# 这里只安装客户端驱动,连接客户现场 SQL Server;镜像内没有 T+ 数据库。 +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates curl gnupg unixodbc tzdata \ + && curl -fsSL https://packages.microsoft.com/keys/microsoft.asc \ + | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg \ + && echo "deb [signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/debian/12/prod bookworm main" \ + > /etc/apt/sources.list.d/mssql-release.list \ + && apt-get update \ + && ACCEPT_EULA=Y DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends msodbcsql18 \ + && apt-get purge -y curl gnupg \ + && apt-get autoremove -y \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=uv /uv /usr/local/bin/uv +WORKDIR /app/backend +COPY backend/pyproject.toml backend/uv.lock backend/.python-version ./ +RUN uv sync --frozen --no-dev --extra tplus --no-cache + +COPY backend/alembic.ini ./ +COPY backend/alembic ./alembic +COPY backend/app ./app +# 保留仓库相对布局,覆盖读取、总量、关联核验和样本核对 SQL。 +COPY db/queries/tplus /app/db/queries/tplus +# V28 迁移从仓库路径读取留存 SQL,镜像必须携带该运行时依赖。 +COPY db/migration /app/db/migration +COPY docker/tplus-maintenance.sh /app/tplus-maintenance.sh + +RUN mkdir -p /app/backend/uploads /app/backend/logs \ + && useradd --uid 10001 --create-home appuser \ + && chown -R appuser:appuser /app/backend/uploads /app/backend/logs +USER appuser +CMD ["python", "-m", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/docker/tplus-maintenance.sh b/docker/tplus-maintenance.sh new file mode 100644 index 0000000..9b4b3bc --- /dev/null +++ b/docker/tplus-maintenance.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# 复用已有单次检查命令;即使检查失败也保留日志并等待下一轮。 +set -u +stopping=0 +child_pid= +stop() { + stopping=1 + if [ -n "$child_pid" ]; then + kill -TERM "$child_pid" 2>/dev/null || : + fi +} +trap stop TERM INT +while [ "$stopping" -eq 0 ]; do + python -m app.cli tplus-maintain --once & + child_pid=$! + if ! wait "$child_pid" && [ "$stopping" -eq 0 ]; then + echo 'T+ 周期检查未完成,请检查运行配置;下一轮重试。' >&2 + fi + [ "$stopping" -eq 0 ] || break + sleep 60 & + child_pid=$! + wait "$child_pid" || : +done