Skip to content

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)!
  1. Immagine base da cui parte la build. Usare immagini slim riduce dimensione e superficie di attacco.
  2. Definisce una variabile disponibile durante la build. ARG puo essere valorizzato con docker build --build-arg APP_VERSION=1.0.0 e non resta automaticamente disponibile a runtime.
  3. Directory di lavoro usata dalle istruzioni successive.
  4. Copia il contenuto del progetto nell'immagine. In produzione conviene usare .dockerignore per escludere file non necessari.
  5. Installa le dipendenze Python senza mantenere cache locale.
  6. Documenta la porta applicativa esposta dal container.
  7. 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)!
  1. Crea lo stage di build e gli assegna l'alias builder. L'alias serve per richiamare questo stage piu avanti con COPY --from=builder.
  2. Definisce un parametro disponibile durante la build dello stage. Gli ARG devono essere dichiarati nello stage in cui vengono usati.
  3. Imposta la directory di lavoro nello stage builder.
  4. Installa solo i pacchetti necessari alla compilazione, evitando raccomandati superflui.
  5. Copia prima il file delle dipendenze per sfruttare meglio la cache Docker.
  6. Installa le dipendenze nello spazio utente, cosi possono essere copiate nello stage finale.
  7. Crea lo stage runtime e gli assegna l'alias runner. Questo stage contiene solo cio che serve per eseguire l'applicazione.
  8. Imposta la directory di lavoro nello stage runner.
  9. Copia dallo stage builder le dipendenze installate, senza portarsi dietro compilatori e tool di build.
  10. Copia il codice applicativo nello stage finale.
  11. Espone nel PATH i binari installati nello spazio utente.
  12. Documenta la porta applicativa esposta dal container.
  13. Definisce il comando base del container.
  14. Argomento predefinito passato a ENTRYPOINT.