|
2 | 2 | # docker buildx create --name mybuilder --driver=docker-container --use |
3 | 3 | # docker buildx build -t ghcr.io/raft-tech/tdp-backend-base:dev-02 -f Dockerfile.base . --platform linux/amd64,linux/arm64 --push |
4 | 4 |
|
| 5 | +# ============================================================================= |
| 6 | +# Stage 1: Builder - Install build dependencies and compile Python packages |
| 7 | +# ============================================================================= |
| 8 | +FROM python:3.10.8-slim-bullseye AS builder |
| 9 | + |
| 10 | +COPY Pipfile Pipfile.lock /tdpapp/ |
| 11 | +WORKDIR /tdpapp/ |
| 12 | + |
| 13 | +# Install build dependencies, Python packages, then clean up in a single layer |
| 14 | +RUN apt-get update && \ |
| 15 | + apt-get install -y --no-install-recommends \ |
| 16 | + gcc \ |
| 17 | + graphviz \ |
| 18 | + graphviz-dev \ |
| 19 | + libpq-dev \ |
| 20 | + python3-dev \ |
| 21 | + curl \ |
| 22 | + ca-certificates && \ |
| 23 | + pip install --no-cache-dir --upgrade pip pipenv && \ |
| 24 | + # If we can remove the '--dev' we will save 200MB. However, so much depends on it that it is easier to keep it for now. |
| 25 | + pipenv install --dev --system --deploy && \ |
| 26 | + rm -rf /var/lib/apt/lists/* |
| 27 | + |
| 28 | +# Download PostgreSQL GPG key in builder stage (so curl isn't needed in runtime) |
| 29 | +RUN install -d /pgdg && \ |
| 30 | + curl -o /pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc |
| 31 | + |
| 32 | +# ============================================================================= |
| 33 | +# Stage 2: Runtime - Minimal image with only runtime dependencies |
| 34 | +# ============================================================================= |
5 | 35 | FROM python:3.10.8-slim-bullseye |
6 | | -ENV PYTHONUNBUFFERED=1 |
7 | 36 |
|
8 | 37 | ARG user=tdpuser |
9 | 38 | ARG group=tdpuser |
10 | 39 | ARG uid=1000 |
11 | 40 | ARG gid=1000 |
| 41 | + |
| 42 | +ENV PYTHONUNBUFFERED=1 |
12 | 43 | ENV DJANGO_SETTINGS_MODULE=tdpservice.settings.local |
13 | 44 | ENV DJANGO_CONFIGURATION=Local |
14 | | -# Allows docker to cache installed dependencies between builds |
15 | | -COPY Pipfile Pipfile.lock /tdpapp/ |
16 | 45 |
|
17 | 46 | WORKDIR /tdpapp/ |
18 | 47 |
|
19 | | -# Download latest listing of available packages: |
20 | | -RUN apt-get -y update |
21 | | -# Upgrade already installed packages: |
22 | | -RUN apt-get -y upgrade |
23 | | -# Install packages: |
24 | | -RUN apt-get install -y gcc graphviz graphviz-dev libpq-dev python3-dev vim curl ca-certificates |
25 | | - |
26 | | -# Postgres client setup |
27 | | -RUN apt-get update -y && apt-get upgrade -y |
28 | | -RUN apt --purge remove postgresql postgresql-* && apt install -y postgresql-common curl ca-certificates && install -d /usr/share/postgresql-common/pgdg && \ |
29 | | -curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc && \ |
30 | | -sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt bullseye-pgdg main" > /etc/apt/sources.list.d/pgdg.list' && \ |
31 | | -apt -y update && apt -y upgrade && apt install postgresql-client-15 -y |
32 | | - |
33 | | -# Install pipenv |
34 | | -RUN pip install --upgrade pip pipenv |
35 | | -RUN pipenv install --dev --system --deploy |
36 | | - |
37 | | -RUN groupadd -g ${gid} ${group} && useradd -u ${uid} -g ${group} -s /bin/sh ${user} |
| 48 | +# Copy PostgreSQL GPG key from builder |
| 49 | +COPY --from=builder /pgdg/apt.postgresql.org.asc /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc |
| 50 | + |
| 51 | +# Install only runtime dependencies and PostgreSQL client in a single layer |
| 52 | +RUN apt-get update && \ |
| 53 | + apt-get install -y --no-install-recommends \ |
| 54 | + libpq5 \ |
| 55 | + graphviz \ |
| 56 | + ca-certificates && \ |
| 57 | + echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt bullseye-pgdg main" > /etc/apt/sources.list.d/pgdg.list && \ |
| 58 | + apt-get update && \ |
| 59 | + apt-get install -y --no-install-recommends postgresql-client-15 && \ |
| 60 | + apt-get clean && \ |
| 61 | + rm -rf /var/lib/apt/lists/* && \ |
| 62 | + groupadd -g ${gid} ${group} && \ |
| 63 | + useradd -u ${uid} -g ${group} -s /bin/sh ${user} |
| 64 | + |
| 65 | +# Copy Python packages from builder stage |
| 66 | +COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages |
| 67 | +COPY --from=builder /usr/local/bin /usr/local/bin |
0 commit comments