-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
91 lines (69 loc) · 2.91 KB
/
Copy pathDockerfile
File metadata and controls
91 lines (69 loc) · 2.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# syntax=docker/dockerfile:1.7
#
# CodeBuddy2API 容器镜像
#
# 构建(通常由 run_docker_in_server.sh deploy 完成):
# docker build -f Dockerfile \
# --build-arg CODEBUDDY2API_GIT_COMMIT_HASH=<git-hash> \
# -t codebuddy2api:<git-hash-prefix> .
#
# 运行(由 run_docker_in_server.sh start/deploy 完成):
# docker run -d -p 8111:8111 \
# -v $DATA/config:/app/config \
# -v $DATA/creds:/app/.codebuddy_creds \
# -v $DATA/logs:/app/logs \
# codebuddy2api:<git-hash-prefix>
ARG UV_PYTHON_DOWNLOADS=0
ARG PYTHON_IMAGE=docker.1ms.run/library/python:3.11-slim
ARG UV_IMAGE=ghcr.io/astral-sh/uv:0.8.15
# ---------- builder: 安装依赖到 /app/.venv ----------
FROM ${UV_IMAGE} AS uv
FROM ${PYTHON_IMAGE} AS python-builder
ARG UV_PYTHON_DOWNLOADS
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
UV_LINK_MODE=copy \
UV_PYTHON_DOWNLOADS=${UV_PYTHON_DOWNLOADS}
COPY --from=uv /uv /uvx /bin/
WORKDIR /app
# 单独 COPY 元数据以最大化缓存命中
COPY pyproject.toml uv.lock README.md ./
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --frozen --no-dev --no-install-project
# 再 COPY 源码。运行时通过 PYTHONPATH=/app 直接加载应用文件,无需安装项目 wheel。
COPY src ./src
COPY config.example.yaml ./
COPY web.py config.py ./
COPY frontend ./frontend
# 冒烟测试:确保关键依赖能正常 import
RUN /app/.venv/bin/python -c "import fastapi, hypercorn, httpx, pydantic, loguru, yaml; from web import app; print('import ok')"
# ---------- runtime: 仅保留 .venv + 应用文件 ----------
FROM ${PYTHON_IMAGE} AS runtime
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
PATH="/app/.venv/bin:$PATH" \
PYTHONPATH=/app
WORKDIR /app
# 把版本信息作为 label(构建时可被 --build-arg 覆盖,放在最后以最大化缓存命中)
ARG CODEBUDDY2API_GIT_COMMIT_HASH=""
ENV CODEBUDDY2API_GIT_COMMIT_HASH=${CODEBUDDY2API_GIT_COMMIT_HASH}
LABEL org.opencontainers.image.revision=${CODEBUDDY2API_GIT_COMMIT_HASH} \
org.opencontainers.image.title="codebuddy2api" \
org.opencontainers.image.source="https://github.com/lihuayong/codebuddy2api"
# 从 builder 拷贝已安装好的虚拟环境
COPY --from=python-builder /app/.venv /app/.venv
# 拷贝运行所需的应用文件(.venv 已含依赖,这里只复制轻量文件)
COPY config.example.yaml ./
COPY web.py config.py ./
COPY src ./src
COPY frontend ./frontend
# 持久化目录(挂载点):配置 / 凭证 / 日志。run_docker_in_server.sh 会 bind mount 这三者。
RUN mkdir -p /app/config /app/.codebuddy_creds /app/logs
EXPOSE 8111
VOLUME ["/app/config", "/app/.codebuddy_creds", "/app/logs"]
# 容器自检,作为 healthcheck
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD python -c "import urllib.request,sys; \
sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:8111/health', timeout=3).status == 200 else 1)" \
|| exit 1
CMD ["python", "web.py"]