1- FROM python:3.12-slim-bookworm as base
1+ FROM python:3.12-slim-bookworm AS base
22
3- RUN apt update \
4- && apt install --no-install-recommends -y \
3+ RUN apt update && apt install --no-install-recommends -y \
54 gcc curl libgdal-dev wkhtmltopdf chromium-driver chromium \
65 && apt clean && rm -rf /var/lib/apt/lists/* \
76 && addgroup --system --gid 82 hcr \
@@ -10,42 +9,82 @@ RUN apt update \
109 --disabled-password --home /home/hcr \
1110 --shell /sbin.nologin --group hcr --gecos hcr \
1211 && mkdir -p /code /tmp /data /static \
13- && chown -R hcr:hcr /code /tmp /data /static
12+ && chown -R hcr:hcr /code /tmp /data /static \
13+ && curl -o /data/waitforit -sSL https://github.com/maxclaus/waitforit/releases/download/v2.4.1/waitforit-linux_amd64 \
14+ && chmod +x /data/waitforit
15+
16+ ENV PATH=/venv/bin:/usr/local/bin/:/usr/bin:/bin:/data \
17+ DJANGO_SETTINGS_MODULE=hope_country_report.config.settings \
18+ PYTHONUNBUFFERED=1 \
19+ PYTHONDONTWRITEBYTECODE=1 \
20+ UV_PROJECT_ENVIRONMENT=/venv \
21+ VIRTUAL_ENV=/venv \
22+ UWSGI_PROCESSES=4 \
23+ PACKAGES_DIR=/code
1424
15- ENV PATH=$PATH:/code/.venv/bin/ \
16- PACKAGES_DIR=/code/.venv/lib/python3.12/site-packages \
17- PYTHONPATH=$PYTHONPATH:/code/src
25+ RUN pip install uv uwsgi
26+ WORKDIR $PACKAGES_DIR
1827
19- WORKDIR /code
28+ FROM base AS builder
2029
21- FROM base as builder
30+ RUN apt update \
31+ && apt install -y --no-install-recommends \
32+ build-essential cmake git libfontconfig1 libgconf-2-4 libglib2.0-0 libnss3 libssl-dev libxml2-dev python3-dev zlib1g-dev \
33+ && apt clean && rm -rf /var/lib/apt/lists/*
2234
23- COPY ../pyproject.toml ./
24- COPY ../uv.lock ./
35+ COPY pyproject.toml uv.lock /code/
36+ COPY src /app/src/
37+ COPY ./tests ./code/tests
2538
26- ADD https://astral.sh/uv/install.sh /uv-installer.sh
27- RUN sh /uv-installer.sh && rm /uv-installer.sh
28- ENV PATH="/root/.local/bin/:$PATH"
39+ RUN --mount=type=cache,target=/root/.uv-cache \
40+ uv sync --cache-dir=/root/.uv-cache \
41+ --python=/usr/local/bin/python \
42+ --python-preference=system \
43+ --frozen --link-mode=copy
2944
30- RUN uv sync
3145
3246FROM builder AS dev
3347
34- WORKDIR /code
35- COPY .. ./
48+ ENV PYTHONPATH=/code/src:/code/tests:$PYTHONPATH \
49+ PATH="/venv/bin:$PATH"
50+
51+
52+ WORKDIR $PACKAGES_DIR
53+ COPY uv.lock README.md MANIFEST.in pyproject.toml /code/
54+ COPY src /code/src/
55+ COPY --from=base /data/waitforit /usr/local/bin/waitforit
56+ COPY tests /code/tests
3657
3758COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
3859ENTRYPOINT ["entrypoint.sh" ]
3960
61+ FROM builder AS prd
4062
41- FROM base AS prd
42-
43- ENV PATH=$PATH:/code/.venv/bin/
44- ENV DJANGO_SETTINGS_MODULE="hope_country_report.config.settings"
63+ ENV PATH="/code/.venv/bin:$PATH" \
64+ DJANGO_SETTINGS_MODULE=hope_country_report.config.settings \
65+ PYTHONUNBUFFERED=1 \
66+ PYTHONDONTWRITEBYTECODE=1 \
67+ UWSGI_PROCESSES=4
4568
69+ COPY --chown=hcr:hcr --from=builder . $PACKAGES_DIR
4670COPY --chown=hcr:hcr .. ./
47- COPY --chown=hcr:hcr --from=builder $PACKAGES_DIR $PACKAGES_DIR
71+
4872USER hcr
4973
5074COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
5175ENTRYPOINT ["entrypoint.sh" ]
76+
77+ FROM dev AS dist
78+
79+ ENV PATH="/code/.venv/bin:$PATH" \
80+ DJANGO_SETTINGS_MODULE=hope_country_report.config.settings \
81+ PYTHONUNBUFFERED=1 \
82+ PYTHONDONTWRITEBYTECODE=1 \
83+ STATIC_URL="/static/" \
84+ UWSGI_PROCESSES=4
85+
86+ COPY --chown=hcr:hcr --from=prd $PACKAGES_DIR $PACKAGES_DIR
87+ COPY --chown=hcr:hcr .. ./
88+
89+ COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
90+ ENTRYPOINT ["entrypoint.sh" ]
0 commit comments