1+
12# syntax=docker/dockerfile:1
23
3- FROM alpine:3.18
4+ # 构建阶段
5+ FROM alpine:3.18 AS builder
6+
7+ ENV VENV_PATH="/opt/venv"
8+
9+ # 安装构建依赖
10+ RUN apk add --no-cache \
11+ python3 \
12+ python3-dev \
13+ gcc \
14+ musl-dev \
15+ libffi-dev \
16+ rust \
17+ cargo \
18+ curl
19+
20+ # 安装 uv
21+ RUN curl -LsSf https://astral.sh/uv/install.sh | sh
22+ ENV PATH="/root/.local/bin:$PATH"
23+
24+ # 设置工作目录
25+ WORKDIR /build
26+
27+ # 复制依赖文件并安装(这层会被缓存,除非依赖文件改变)
28+ COPY backend/pyproject.toml backend/uv.lock ./
29+
30+ # 安装Python依赖
31+ RUN uv sync --frozen --no-dev && mv .venv $VENV_PATH
32+
33+ # 运行阶段
34+ FROM alpine:3.18 AS runtime
435
536ENV LANG="C.UTF-8" \
637 TZ=Asia/Shanghai \
738 PUID=1000 \
839 PGID=1000 \
940 UMASK=022 \
10- PATH="/root/.local/bin:$PATH"
41+ VENV_PATH="/opt/venv" \
42+ PATH="/opt/venv/bin:/root/.local/bin:$PATH"
1143
1244WORKDIR /app
1345
14- # Copy Python project files
15- COPY backend/pyproject.toml backend/uv.lock ./
16-
46+ # 只安装运行时依赖
1747RUN set -ex && \
1848 apk add --no-cache \
19- bash \
20- busybox-suid \
21- python3 \
22- python3-dev \
23- py3-aiohttp \
24- py3-bcrypt \
25- curl \
26- gcc \
27- musl-dev \
28- libffi-dev \
29- su-exec \
30- shadow \
31- tini \
32- openssl \
33- tzdata \
34- rust \
35- cargo && \
36- # Install uv
37- curl -LsSf https://astral.sh/uv/install.sh | sh && \
38- # Verify uv installation and show version
39- uv --version && \
40- # Check if lock file exists and is readable
41- ls -la uv.lock && \
42- # Install dependencies using uv
43- uv sync --frozen --no-dev && \
44- # Remove build dependencies to reduce image size
45- apk del \
46- rust \
47- cargo \
48- gcc \
49- musl-dev \
50- libffi-dev \
51- python3-dev && \
52- # Add user
49+ bash \
50+ busybox-suid \
51+ python3 \
52+ py3-aiohttp \
53+ py3-bcrypt \
54+ curl \
55+ su-exec \
56+ shadow \
57+ tini \
58+ openssl \
59+ tzdata && \
60+ # 添加用户
5361 mkdir -p /home/ab && \
5462 addgroup -S ab -g 911 && \
5563 adduser -S ab -G ab -h /home/ab -s /sbin/nologin -u 911 && \
56- # Clear
57- rm -rf \
58- /root/.cache \
59- /root/.local \
60- /tmp/*
64+ # 清理缓存
65+ rm -rf /var/cache/apk/* /tmp/*
66+
67+ # 从构建阶段复制虚拟环境
68+ COPY --from=builder $VENV_PATH $VENV_PATH
6169
70+ # 复制应用代码(放在最后,因为代码变更最频繁)
6271COPY --chmod=755 backend/src/. .
6372COPY --chmod=755 entrypoint.sh /entrypoint.sh
6473
6574ENTRYPOINT ["tini" , "-g" , "--" , "/entrypoint.sh" ]
66-
6775EXPOSE 7892
68- VOLUME [ "/app/config" , "/app/data" ]
76+ VOLUME [ "/app/config" , "/app/data" ]
77+
78+
0 commit comments