This commit is contained in:
2025-11-07 09:05:58 +08:00
parent 407fc127b7
commit 5129c46b5a

126
Dockerfile Normal file
View File

@@ -0,0 +1,126 @@
# LandPPT Docker Image
# Multi-stage build for minimal image size
# Build stage
FROM python:3.11-slim AS builder
# Set environment variables for build
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
PIP_NO_CACHE_DIR=1 \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
UV_PROJECT_ENVIRONMENT=/opt/venv
# Install build dependencies
RUN apt-get update && \
apt-get install -y --no-install-recommends \
build-essential \
curl \
git \
&& rm -rf /var/lib/apt/lists/*
# Install uv for faster dependency management
RUN pip install --no-cache-dir uv
# Set work directory and copy dependency files
WORKDIR /app
COPY pyproject.toml uv.lock* README.md ./
COPY src/ ./src/
# Install Python dependencies using uv
# uv sync will create venv at UV_PROJECT_ENVIRONMENT and install all dependencies
RUN uv sync && \
uv pip install apryse-sdk>=11.5.0 --extra-index-url=https://pypi.apryse.com && \
# Verify key packages are installed
/opt/venv/bin/python -c "import uvicorn; import playwright; import fastapi" && \
# Clean up build artifacts
find /opt/venv -name "*.pyc" -delete && \
find /opt/venv -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null || true
# Production stage
FROM python:3.11-slim AS production
# Set environment variables
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
PYTHONPATH=/app/src:/opt/venv/lib/python3.11/site-packages \
PATH=/opt/venv/bin:$PATH \
PLAYWRIGHT_BROWSERS_PATH=/root/.cache/ms-playwright \
HOME=/root \
VIRTUAL_ENV=/opt/venv
# Install essential runtime dependencies and wkhtmltopdf
RUN apt-get update && \
apt-get install -y --no-install-recommends \
poppler-utils \
libmagic1 \
ca-certificates \
curl \
wget \
chromium \
libgomp1 \
fonts-liberation \
fonts-noto-cjk \
fontconfig \
netcat-openbsd \
xfonts-75dpi \
xfonts-base \
libjpeg62-turbo \
libxrender1 \
libfontconfig1 \
libx11-6 \
libxext6 \
&& \
# Download and install wkhtmltopdf from official releases
WKHTMLTOPDF_VERSION="0.12.6.1-3" && \
wget -q "https://github.com/wkhtmltopdf/packaging/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}.bookworm_amd64.deb" -O /tmp/wkhtmltox.deb && \
dpkg -i /tmp/wkhtmltox.deb || apt-get install -f -y && \
rm /tmp/wkhtmltox.deb && \
fc-cache -fv && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /root/.cache
# Create non-root user (for compatibility, but run as root)
RUN groupadd -r landppt && \
useradd -r -g landppt -m -d /home/landppt landppt && \
mkdir -p /home/landppt/.cache/ms-playwright /root/.cache/ms-playwright
# Copy Python packages from builder
COPY --from=builder /opt/venv /opt/venv
# Install Playwright browsers (chromium) - package already installed in builder stage
RUN python -m playwright install chromium && \
chown -R landppt:landppt /home/landppt && \
rm -rf /tmp/* /var/tmp/*
# Set work directory
WORKDIR /app
# Copy application code (minimize layers)
COPY run.py ./
COPY src/ ./src/
COPY template_examples/ ./template_examples/
COPY docker-healthcheck.sh docker-entrypoint.sh ./
COPY .env.example ./.env
# Create directories and set permissions in one layer
RUN chmod +x docker-healthcheck.sh docker-entrypoint.sh && \
mkdir -p temp/ai_responses_cache temp/style_genes_cache temp/summeryanyfile_cache temp/templates_cache \
research_reports lib/Linux lib/MacOS lib/Windows uploads data && \
chown -R landppt:landppt /app /home/landppt && \
chmod -R 755 /app /home/landppt && \
chmod 666 /app/.env
# Keep landppt user but run as root to handle file permissions
# USER landppt
# Expose port
EXPOSE 8000
# Minimal health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=2 \
CMD ./docker-healthcheck.sh
# Set entrypoint and command
ENTRYPOINT ["./docker-entrypoint.sh"]
CMD ["python", "run.py"]