This commit is contained in:
dxin
2025-10-16 11:52:59 +08:00
parent aa16443f1d
commit 82a4aa0e14
8 changed files with 315 additions and 0 deletions

View File

@@ -0,0 +1,116 @@
# 使用 Python 3.12.9 官方镜像
FROM python:3.12.9-slim
# 系统优化与依赖和编译环境
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
gcc \
autoconf \
make \
libssl-dev \
libffi-dev \
python3-dev \
&& rm -rf /var/lib/apt/lists/*
# 设置时区
ENV TZ=Asia/Shanghai
# 创建应用目录
WORKDIR /app
# 复制依赖清单
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目代码
COPY . .
# 创建日志目录(即使宿主机未挂载也能运行)
RUN mkdir -p /app/logs
RUN chmod +x /app/start.sh
# 启动环境(默认 prod
ENV APP_ENV=prod
# Entrypoint 会根据 APP_ENV 动态决定配置文件
# 这里不直接启动 gunicorn而是用 start.sh 控制日志等
ENTRYPOINT ["bash", "start.sh"]
#-----------------------------------------------
# 基于你自己的基础镜像
FROM uswccr.ccs.tencentyun.com/lessie/python:3.12.9-base
LABEL maintainer="lessie <ops@lessie.ai>"
ENV TZ=Asia/Shanghai
WORKDIR /app
# 拷贝依赖文件并安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 拷贝项目代码
COPY . .
# 创建日志目录
RUN mkdir -p /app/logs && chmod +x /app/start.sh
# 环境变量(可在 compose 覆盖)
ENV APP_ENV=local
# 启动命令
ENTRYPOINT ["bash", "start.sh"]
#-----------------------------------------------
# docker build -t lessie/lessie-sourcing-agents:v0.0.1 .
# docker images | grep lessie
# docker tag lessie/lessie-sourcing-agents:v0.0.1 uswccr.ccs.tencentyun.com/lessie/lessie-sourcing-agents:v0.0.1
# docker push uswccr.ccs.tencentyun.com/lessie/lessie-sourcing-agents:v0.0.1
# --------------------------
# Stage 1: Builder
# --------------------------
FROM uswccr.ccs.tencentyun.com/lessie/python:3.12.9-base AS builder
LABEL maintainer="lessie <ops@lessie.ai>"
ENV TZ=Asia/Shanghai
WORKDIR /app
# 拷贝依赖文件并安装依赖到 /app/deps
COPY requirements.txt .
RUN pip install --no-cache-dir --prefix=/app/deps -r requirements.txt
# --------------------------
# Stage 2: Runtime
# --------------------------
# 最终运行镜像,用 slim 最小化
FROM python:3.12.9-slim
ENV TZ=Asia/Shanghai
WORKDIR /app
# 拷贝已安装的依赖
COPY --from=builder /app/deps /usr/local
# 拷贝项目代码
COPY . .
# 创建日志目录
RUN mkdir -p /app/logs && chmod +x /app/start.sh
# 环境变量(可在 docker-compose 覆盖)
ENV APP_ENV=local
# 启动命令
ENTRYPOINT ["bash", "start.sh"]

View File

@@ -0,0 +1,45 @@
# 基础镜像:官方 Python 3.12.9
FROM python:3.12.9-slim
LABEL maintainer="lessie" \
description="Python 3.12.9 base image with optimized system tools and build environment" \
version="3.12.9"
# 环境变量
ENV TZ=Asia/Shanghai \
LANG=C.UTF-8 \
DEBIAN_FRONTEND=noninteractive \
PATH="/usr/local/bin:$PATH"
# 系统优化与常用工具安装
RUN apt-get update && \
apt-get install -y --no-install-recommends \
build-essential \
gcc \
g++ \
make \
curl \
wget \
vim \
git \
tzdata \
ca-certificates \
net-tools \
iputils-ping \
libssl-dev \
libffi-dev \
libpq-dev \
libxml2-dev \
libxslt-dev \
zlib1g-dev \
libjpeg-dev \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# pip 优化:禁用缓存,升级工具链
RUN pip install --no-cache-dir --upgrade pip setuptools wheel
WORKDIR /app
CMD ["python3"]

View File

@@ -0,0 +1,37 @@
version: "3.9"
networks:
lessie_network:
name: lessie_network
driver: bridge
ipam:
config:
- subnet: 10.17.1.0/24
services:
sourcing-agents:
container_name: lessie-sourcing-agents-s2
image: uswccr.ccs.tencentyun.com/lessie/lessie-sourcing-agents:latest
restart: always
environment:
APP_ENV: s2
TZ: Asia/Shanghai
ports:
- "7001:7001"
volumes:
# 日志映射
- ./logs:/app/logs
# 凭证映射
- /root/.aws:/root/.aws
- /root/.google:/root/.google
# 使用固定网络
networks:
- lessie_network
command: ["/bin/bash", "/app/start.sh"]

View File

@@ -0,0 +1,47 @@
FROM python:3.12-slim AS builder
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
UV_LINK_MODE=copy \
UV_VERSION=0.4.17 \
UV_PROJECT_ENVIRONMENT=/opt/venv
WORKDIR /app
# Install build prerequisites, fetch uv, then remove leftover apt metadata.
RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates build-essential && \
rm -rf /var/lib/apt/lists/*
RUN curl -LsSf https://astral.sh/uv/install.sh | sh -s -- --version "${UV_VERSION}"
# Pre-copy manifests for better layer caching.
COPY pyproject.toml uv.lock requirements.txt ./
RUN /root/.local/bin/uv sync --frozen --no-dev --python /usr/local/bin/python && \
/root/.local/bin/uv cache prune --ci
FROM python:3.12-slim AS runtime
ARG APP_PORT=8000
ENV APP_ENV=local \
APP_PORT=${APP_PORT}
WORKDIR /app
# Runtime dependencies required by packages like faiss-cpu.
RUN apt-get update && apt-get install -y --no-install-recommends libgomp1 && \
rm -rf /var/lib/apt/lists/*
# Bring in the pre-built virtual environment from the builder stage.
COPY --from=builder /opt/venv /opt/venv
# Ship only the application sources in the runtime image.
COPY . .
ENV PATH="/opt/venv/bin:${PATH}" \
VIRTUAL_ENV="/opt/venv"
EXPOSE ${APP_PORT}
CMD ["sh", "-c", "python server.py --host ${HOST:-0.0.0.0} --port ${APP_PORT:-8000}"]

View File

@@ -0,0 +1,75 @@
# chmod +x start.sh
#-----------------------------------------
#!/usr/bin/env bash
set -e
# 打印启动环境
echo "[*] Starting app with APP_ENV=${APP_ENV}"
# 日志路径(宿主机会挂载)
LOG_DIR="/app/logs"
mkdir -p "$LOG_DIR"
# 动态生成日志文件名
LOGFILE="${LOG_DIR}/lessie_sourcing_agents_$(date +'%Y%m%d_%H%M%S').log"
LATEST_LOG="${LOG_DIR}/lessie_sourcing_agents_latest.log"
# 启动命令
echo "[*] Launching Gunicorn..."
nohup env APP_ENV=${APP_ENV} \
gunicorn -w 4 -k uvicorn.workers.UvicornWorker \
-b 0.0.0.0:7001 --timeout 300 dialogue.app:app \
--max-requests 500 --max-requests-jitter 50 \
> "$LOGFILE" 2>&1 &
# 建立软链方便查看最新日志
ln -sf "$LOGFILE" "$LATEST_LOG"
echo "[*] App started. Logs: $LATEST_LOG"
# 前台挂起(防止容器退出)
tail -F "$LOGFILE"
#-----------------------------------------
#!/bin/bash
#脚本出错立即退出,防止容器假活
set -e
# 进入项目目录
cd /app
# 日志目录
LOG_DIR="/app/logs"
mkdir -p "$LOG_DIR"
# 日志文件(同时软链一个 latest.log 方便定位)
LOG_FILE="${LOG_DIR}/lessie_sourcing_agents_$(date +'%Y%m%d_%H%M%S').log"
ln -sf "$LOG_FILE" "${LOG_DIR}/lessie_sourcing_agents_latest.log"
# 环境变量(默认 prod可通过 docker run -e APP_ENV=s1 覆盖)
APP_ENV="${APP_ENV:-prod}"
echo "[INFO] Starting app in environment: ${APP_ENV}"
# Python 环境检查
echo "[INFO] Python version:"
python3 --version
# 启动 Gunicorn
# 输出到 stdout 的同时 tee 一份到日志文件
echo "[INFO] Launching Gunicorn..."
exec gunicorn -w ${cfg_gunicornWorkers:-4} \
-k uvicorn.workers.UvicornWorker \
-b 0.0.0.0:${cfg_port:-7001} \
--timeout 300 \
--max-requests 500 \
--max-requests-jitter 50 \
--access-logfile - \
--error-logfile - \
dialogue.app:app \
2>&1 | tee -a "$LOG_FILE"

View File

@@ -0,0 +1,23 @@
# 构建Docker镜像 -t 标志用于指定镜像名称和标签 | . 表示当前目录作为构建上下文(即 Dockerfile 和代码所在目录)
docker build -t uswccr.ccs.tencentyun.com/lessie/lessie-sourcing-agents:v0.1 .
# 查看镜像
docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# myapp latest 9f4e919c2146 4 minutes ago 1.55GB
docker login uswccr.ccs.tencentyun.com -u 100038894437
docker push uswccr.ccs.tencentyun.com/lessie/lessie-sourcing-agents:v0.1
# 登录
docker login uswccr.ccs.tencentyun.com -u 100038894437 回车后输出密码: h8H1o6Fd!HLXn
# 打 tag
docker tag lessie/python:3.12.9-base uswccr.ccs.tencentyun.com/lessie/python:3.12.9-base
# 推送
docker push uswccr.ccs.tencentyun.com/lessie/python:3.12.9-base