@@ -18,7 +18,6 @@ RUN uv python install "$PYTHON_VERSION"
18
18
19
19
WORKDIR /app
20
20
21
- COPY ./app .
22
21
COPY pyproject.toml .
23
22
24
23
# venv
@@ -29,7 +28,22 @@ ENV PATH="$VENV/bin:$PATH"
29
28
RUN uv venv $UV_PROJECT_ENVIRONMENT \
30
29
&& uv pip install -r pyproject.toml
31
30
32
- FROM python:${PYTHON_VERSION}-slim-bookworm as runner
31
+ COPY ./app .
32
+
33
+ FROM python:${PYTHON_VERSION}-slim-bookworm as deps
34
+
35
+ # avoid stuck build due to user prompt
36
+ ARG DEBIAN_FRONTEND=noninteractive
37
+
38
+ # install dependencies
39
+ RUN apt-get -qq update \
40
+ && apt-get -qq install \
41
+ --no-install-recommends -y \
42
+ curl \
43
+ lsof \
44
+ && rm -rf /var/lib/apt/lists/*
45
+
46
+ FROM deps as runner
33
47
34
48
# set timezone
35
49
ENV TZ=${TZ:-"America/Chicago"}
@@ -51,17 +65,6 @@ ENV PYTHONPATH=/app
51
65
# https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker/blob/master/README.md#web_concurrency
52
66
ENV WEB_CONCURRENCY=2
53
67
54
- # avoid stuck build due to user prompt
55
- ARG DEBIAN_FRONTEND=noninteractive
56
-
57
- # install dependencies
58
- RUN apt-get -qq update \
59
- && apt-get -qq install \
60
- --no-install-recommends -y \
61
- curl \
62
- lsof \
63
- && rm -rf /var/lib/apt/lists/*
64
-
65
68
# add non-root user
66
69
ARG UID=10001
67
70
RUN adduser \
@@ -80,9 +83,12 @@ COPY --from=builder --chown=${USER_NAME}:${USER_NAME} /python /python
80
83
81
84
WORKDIR /app
82
85
83
- COPY --chown=${USER_NAME} ./app .
86
+ # Copy venv first (has better caching properties)
84
87
COPY --from=builder --chown=${USER_NAME} "$VENV" "$VENV"
85
88
89
+ # Copy application code last
90
+ COPY --chown=${USER_NAME} ./app .
91
+
86
92
ARG PORT=${PORT:-3100}
87
93
EXPOSE $PORT
88
94
0 commit comments