Dockerfile¶
Un Dockerfile descrive come costruire un'immagine container in modo ripetibile. Ogni istruzione produce uno step di build e contribuisce alla definizione del filesystem, delle dipendenze e del comando di avvio dell'immagine.
FROM python:3.11-slim # (1)!
ARG APP_VERSION=dev # (2)!
WORKDIR /app # (3)!
COPY . . # (4)!
RUN pip install --no-cache-dir -r requirements.txt # (5)!
EXPOSE 5000 # (6)!
CMD ["python", "app.py"] # (7)!
- Immagine base da cui parte la build. Usare immagini slim riduce dimensione e superficie di attacco.
- Definisce una variabile disponibile durante la build.
ARGpuo essere valorizzato condocker build --build-arg APP_VERSION=1.0.0e non resta automaticamente disponibile a runtime. - Directory di lavoro usata dalle istruzioni successive.
- Copia il contenuto del progetto nell'immagine. In produzione conviene usare
.dockerignoreper escludere file non necessari. - Installa le dipendenze Python senza mantenere cache locale.
- Documenta la porta applicativa esposta dal container.
- Comando predefinito eseguito quando il container viene avviato.
Dockerfile Multistage¶
La build multistage separa la fase di compilazione/installazione dalla fase runtime. Questo permette di copiare nell'immagine finale solo cio che serve all'esecuzione dell'applicazione.
FROM python:3.11-slim AS builder # (1)!
ARG APP_VERSION=dev # (2)!
WORKDIR /app # (3)!
RUN apt-get update && apt-get install -y --no-install-recommends gcc python3-dev # (4)!
COPY requirements.txt . # (5)!
RUN pip install --user --no-cache-dir -r requirements.txt # (6)!
FROM python:3.11-slim AS runner # (7)!
WORKDIR /app # (8)!
COPY --from=builder /root/.local /root/.local # (9)!
COPY . . # (10)!
ENV PATH=/root/.local/bin:$PATH # (11)!
EXPOSE 5000 # (12)!
ENTRYPOINT ["python"] # (13)!
CMD ["app.py"] # (14)!
- Crea lo stage di build e gli assegna l'alias
builder. L'alias serve per richiamare questo stage piu avanti conCOPY --from=builder. - Definisce un parametro disponibile durante la build dello stage. Gli
ARGdevono essere dichiarati nello stage in cui vengono usati. - Imposta la directory di lavoro nello stage
builder. - Installa solo i pacchetti necessari alla compilazione, evitando raccomandati superflui.
- Copia prima il file delle dipendenze per sfruttare meglio la cache Docker.
- Installa le dipendenze nello spazio utente, cosi possono essere copiate nello stage finale.
- Crea lo stage runtime e gli assegna l'alias
runner. Questo stage contiene solo cio che serve per eseguire l'applicazione. - Imposta la directory di lavoro nello stage
runner. - Copia dallo stage
builderle dipendenze installate, senza portarsi dietro compilatori e tool di build. - Copia il codice applicativo nello stage finale.
- Espone nel
PATHi binari installati nello spazio utente. - Documenta la porta applicativa esposta dal container.
- Definisce il comando base del container.
- Argomento predefinito passato a
ENTRYPOINT.