Vai al contenuto principale

Docker Build Args: la guida definitiva per i data professional

Scopri come potenziare il tuo workflow di containerizzazione con i Docker build arguments per ambienti flessibili, sicuri e coerenti.
· 11 min leggi

Scopri con l'IA

Hai difficoltà con build Docker incoerenti nel tuo team di sviluppo? Gli argomenti di build potrebbero essere ciò che stai cercando. Sono una soluzione ideale per creare immagini Docker flessibili e standardizzate. Ti permettono di iniettare valori nel processo di build senza hardcodificarli, rendendo i tuoi Dockerfile più portabili e facili da mantenere.

I build args di Docker risolvono problemi comuni, come la gestione di diverse immagini di base, versioni di pacchetti o impostazioni di configurazione tra ambienti.

La documentazione ufficiale di Docker consiglia i build args per parametrizzare le build invece di usare in modo improprio le variabili d'ambiente. Sono particolarmente utili nelle pipeline CI/CD, dove serve creare immagini con configurazioni diverse partendo dallo stesso Dockerfile.

> Nuovo al mondo di Docker e dei containers? Segui la nostra guida per partire subito.

In questo articolo ti mostro come usare gli argomenti di build di Docker per creare workflow di containerizzazione più efficienti, sicuri e flessibili.

Introduzione ai Docker Build Args

Gli argomenti di build (o build args) sono variabili che tu passi a Docker in fase di build, e sono disponibili solo durante la costruzione dell'immagine. 

A differenza delle variabili d'ambiente, che persistono nel container in runtime, i build args esistono solo nel contesto del comando docker build e scompaiono una volta creata l'immagine. Funzionano in modo simile ai parametri di funzione, permettendoti di iniettare valori diversi ogni volta che costruisci un'immagine.

I casi d'uso principali dei build args ruotano attorno alla creazione di Dockerfile flessibili e riutilizzabili. 

Puoi usare i build args per specificare immagini di base differenti (come passare da Alpine a Debian), impostare versioni dell'applicazione senza modificare il Dockerfile o configurare impostazioni di build come proxy o URL dei repository. Questa flessibilità torna molto utile nelle pipeline CI/CD in cui potresti costruire lo stesso Dockerfile con parametri diversi in base al target di deploy.

I build args danno il meglio quando devi personalizzare le build senza mantenere varianti multiple del Dockerfile. Ti aiutano a seguire il principio DRY (Don't Repeat Yourself) centralizzando la logica di configurazione del container e consentendo al tempo stesso la personalizzazione. 

Sono perfetti anche per gestire le differenze tra ambienti di sviluppo, test e produzione che dovrebbero influenzare solo come viene costruita l'immagine, non come gira il container.

Ora che sai cosa sono i build args, vediamo come usarli.

Definire e utilizzare gli argomenti di build

Passiamo alla pratica su come implementare i build arguments. Si presume che tu abbia Docker installato e configurato.

Sintassi di base e ambito

Puoi dichiarare i build arguments nel Dockerfile usando l'istruzione ARG, che può apparire prima o dopo l'istruzione FROM, a seconda di quando ti serve usarli. Ecco la sintassi di base:

# Setting a build arg with a default value
ARG VERSION=latest

# Using the build arg
FROM ubuntu:${VERSION}

Puoi fornire i valori quando costruisci l'immagine usando il flag --build-arg:

docker build --build-arg VERSION=20.04 -t myapp:20.04 .

Immagine 1 - Build args di base in Docker

Immagine 1 - Build args di base in Docker

L'ambito dei build args segue regole specifiche importanti da capire. Gli argomenti dichiarati prima dell'istruzione FROM sono disponibili solo prima di FROM e devono essere ridefiniti dopo se ti servono più avanti. 

Questo succede perché ogni istruzione FROM avvia una nuova fase di build con il proprio ambito. Questo comportamento è fondamentale da ricordare, soprattutto nelle build multi-stage.

Tecniche avanzate di dichiarazione

Creiamo un'applicazione Flask "Hello World" completa che usa i build args per supportare configurazioni diverse:

> Scopri come containerizzare un'applicazione con Docker.

Per prima cosa, crea una semplice app Flask (app.py):

from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello_world():
    return "Hello, World!"


if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

Già che ci sei, crea anche un file requirements.txt:

flask==3.1.0

Ora creiamo un Dockerfile che usa i build args per una configurazione flessibile:

# Define build arguments with default values
ARG PYTHON_VERSION=3.13
ARG ENVIRONMENT=production

# Use the PYTHON_VERSION arg in the FROM instruction
FROM python:${PYTHON_VERSION}-slim

# Redeclare args needed after FROM
ARG ENVIRONMENT
ENV FLASK_ENV=${ENVIRONMENT}

# Set working directory
WORKDIR /app

# Copy requirements file
COPY requirements.txt .

# Install dependencies based on environment
RUN if [ "$ENVIRONMENT" = "development" ]; then \
      pip install -r requirements.txt && \
      pip install pytest black; \
    else \
      pip install --no-cache-dir -r requirements.txt; \
    fi

# Copy application code
COPY . .

# Expose port
EXPOSE 5000

# Set default command
CMD ["python", "app.py"]

> Il Dockerfile sopra ti sembra complicato? Impara Docker da zero con la nostra guida.

Per costruire questa immagine per lo sviluppo con una versione specifica di Python, esegui dal Terminale:

# Building for development with Python 3.11
docker build \
  --build-arg PYTHON_VERSION=3.11 \
  --build-arg ENVIRONMENT=development \
  -t flaskapp:dev .

Immagine 2 - Build args in un'applicazione Python di base

Immagine 2 - Build args in un'applicazione Python di base

Nelle build multi-stage, i build args richiedono un trattamento speciale. Ecco un esempio completo che mostra come passare argomenti tra più fasi con la nostra app Flask:

# Dockerfile for a multi-stage build
ARG PYTHON_VERSION=3.13

# Build stage
FROM python:${PYTHON_VERSION}-slim AS builder
ARG ENVIRONMENT=production
ENV FLASK_ENV=${ENVIRONMENT}

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .
# In a real app, you might run tests or build assets here
RUN echo "Building Flask app for ${ENVIRONMENT}"

# Production stage
FROM python:${PYTHON_VERSION}-slim
ARG ENVIRONMENT
ENV FLASK_ENV=${ENVIRONMENT}

WORKDIR /app
COPY --from=builder /usr/local/lib/python*/site-packages /usr/local/lib/python*/site-packages
COPY --from=builder /app .

# Add metadata based on build args
LABEL environment="${ENVIRONMENT}" \
      python_version="${PYTHON_VERSION}"

EXPOSE 5000
CMD ["python", "app.py"]

Ora puoi costruirla con una versione specifica di Python e ambiente:

docker build \
  --build-arg PYTHON_VERSION=3.12 \
  --build-arg ENVIRONMENT=staging \
  -t flaskapp:staging .

Immagine 3 - Build args nelle build multi-stage

Immagine 3 - Build args nelle build multi-stage

In breve, questo approccio ti permette di mantenere una configurazione coerente in tutte le fasi della build.

Argomenti di build predefiniti

Docker fornisce diversi build args predefiniti che puoi usare senza dichiararli prima. Sono:

  • HTTP_PROXY e HTTPS_PROXY: utili per build in ambienti aziendali con server proxy.
  • FTP_PROXY: simile agli HTTP proxy ma per connessioni FTP.
  • NO_PROXY: specifica gli host che devono bypassare il proxy.
  • BUILD_DATE e VCS_REF: spesso usati per metadati e versionamento delle immagini.

Questi argomenti predefiniti sono utili quando costruisci immagini in ambienti con configurazioni di rete specifiche. Ad esempio, in una rete aziendale con requisiti di proxy rigidi, puoi usare:

docker build --build-arg HTTP_PROXY=http://proxy.example.com:8080 .

Questo approccio mantiene il tuo Dockerfile portabile pur funzionando in ambienti con restrizioni.

Implicazioni di sicurezza e mitigazione dei rischi

Sebbene gli argomenti di build offrano flessibilità, introducono anche potenziali rischi per la sicurezza che devi conoscere per mantenere sicure le tue immagini Docker.

Vettori di leakage degli argomenti

I build args non sono privati come potresti pensare. I loro valori possono fuoriuscire attraverso vari vettori che molti sviluppatori trascurano. Innanzitutto, la cronologia dell'immagine Docker espone tutti i tuoi build args: chiunque abbia accesso all'immagine può eseguire docker history per vedere i valori usati in fase di build, inclusi potenzialmente informazioni sensibili come chiavi API o token.

docker history flaskapp:dev

Immagine 4 - Docker history

Immagine 4 - Docker history

Anche i layer intermedi possono perdere i build args. Anche se usi una build multi-stage e non copi il layer che contiene informazioni sensibili, i valori dei build args restano nella cache dei layer sulla macchina di build. Ciò significa che chiunque abbia accesso al demone Docker sul tuo server di build potrebbe potenzialmente estrarre queste informazioni.

I log di CI/CD rappresentano un altro rischio significativo. La maggior parte dei sistemi CI/CD registra l'intero comando di build, inclusi eventuali build args passati sulla riga di comando.

Ad esempio, questo comando completo, incluso API_KEY, sarà visibile nei log di CI/CD:

docker build --build-arg API_KEY=secret123 -t myapp:latest .

Questi log sono spesso accessibili a un gruppo ampio di sviluppatori o persino archiviati in sistemi di terze parti, aumentando la superficie di esposizione di valori sensibili.

Alternative sicure

Per informazioni sensibili, dovresti usare la funzionalità dei secret di Docker BuildKit al posto dei build args. BuildKit ti consente di montare segreti durante il processo di build senza persisterli nell'immagine finale o nella cronologia.

Ecco un esempio di Dockerfile che usa i secret di Docker BuildKit:

FROM python:3.13-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

# Use secret mount instead of build arg
RUN --mount=type=secret,id=api_key \
    cat /run/secrets/api_key > api_key.txt

EXPOSE 5000
CMD ["python", "app.py"]

Per costruire questa immagine con un secret, crea prima il file api_key.txt:

echo "my-secret-api-key" > api_key.txt

Poi costruisci l'immagine con il secret:

DOCKER_BUILDKIT=1 docker build \
  --secret id=api_key,src=api_key.txt \
  -t flaskapp:secure .

Immagine 5 - Costruire immagini con i secret di BuildKit

Immagine 5 - Costruire immagini con i secret di BuildKit

Per configurazioni che devono essere disponibili in runtime, le variabili d'ambiente restano l'approccio preferito. Possono essere impostate all'avvio del container senza essere incorporate nell'immagine:

# Set environment variables at runtime
docker run -e API_KEY=secret123 -p 5000:5000 flaskapp:latest

Per gestire in modo sicuro configurazioni sensibili in produzione, valuta l'uso di piattaforme di orchestrazione come Kubernetes, che offrono metodi sicuri come i Secret per gestire informazioni riservate. Anche Docker Swarm offre funzionalità simili con la gestione dei secret.

> Docker non è l'unica piattaforma di containerizzazione. Leggi di Podman per scoprire quale strumento fa più al caso tuo.

Ricorda, la regola pratica è: usa i build args per configurazioni di build non sensibili, usa i secret di BuildKit per esigenze sensibili in build-time, e usa variabili d'ambiente o i secret della piattaforma di orchestrazione per la configurazione in runtime.

Integrazione con gli ecosistemi di container

Tolte di mezzo le basi, vediamo come sfruttare i build args all'interno di ecosistemi Docker più ampi e strumenti di build moderni.

Docker Compose

Docker Compose rende semplice definire e condividere i build args tra le tue applicazioni multi-container.

Se vuoi seguire passo passo, ecco una struttura di progetto completa per due semplici servizi Flask:

flask-project/
├── docker-compose.yml         # Main compose configuration
├── .env                       # Environment variables for compose
├── web/
│   ├── Dockerfile             # Web service Dockerfile
│   ├── app.py                 # Flask application
│   └── requirements.txt       # Python dependencies
├── api/
│   ├── Dockerfile             # API service Dockerfile
│   ├── app.py                 # API Flask application  
│   └── requirements.txt       # API dependencies

Passo velocemente sui contenuti dei file, uno per uno:

web/app.py

from flask import Flask, render_template

app = Flask(__name__)


@app.route("/")
def index():
    return render_template("index.html", title="Flask Web App")


@app.route("/about")
def about():
    return "About page - Web Service"


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

web/requirements.txt

flask==3.1.0

web/Dockerfile

# Web service Dockerfile
ARG PYTHON_VERSION=3.13

FROM python:${PYTHON_VERSION}-slim

# Redeclare the build arg to use it after FROM
ARG PYTHON_VERSION
ARG ENVIRONMENT=production

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV FLASK_ENV=${ENVIRONMENT}

WORKDIR /app

# Copy and install requirements
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copy application code
COPY . .

# Create a simple template folder and file if not exists
RUN mkdir -p templates && \
    echo "<html><body><h1>Hello from Web Service</h1><p>Python version: ${PYTHON_VERSION}</p><p>Environment: ${ENVIRONMENT}</p></body></html>" > templates/index.html

EXPOSE 5000

CMD ["python", "app.py"]

api/app.py

from flask import Flask, jsonify

app = Flask(__name__)


@app.route("/api/health")
def health():
    return jsonify({"status": "healthy"})


@app.route("/api/data")
def get_data():
    return jsonify(
        {"message": "Hello from the API service", "items": ["item1", "item2", "item3"]}
    )


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)

api/requirements.txt

flask==3.1.0

api/Dockerfile

ARG PYTHON_VERSION=3.13

FROM python:${PYTHON_VERSION}-slim

# Redeclare the build arg to use it after FROM
ARG PYTHON_VERSION
ARG ENVIRONMENT=production

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV FLASK_ENV=${ENVIRONMENT}

WORKDIR /app

# Copy and install requirements
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copy application code
COPY . .

# Add metadata label based on build args
LABEL python.version="${PYTHON_VERSION}" \
      app.environment="${ENVIRONMENT}"

EXPOSE 8000

CMD ["python", "app.py"]

.env

PYTHON_VERSION=3.10
ENVIRONMENT=development

docker-compose.yml

services:
  web:
    build:
      context: ./web
      dockerfile: Dockerfile
      args:
        PYTHON_VERSION: ${PYTHON_VERSION:-3.13}
        ENVIRONMENT: ${ENVIRONMENT:-development}
    ports:
      - "5000:5000"
    depends_on:
      - api
    
  api:
    build:
      context: ./api
      dockerfile: Dockerfile
      args:
        PYTHON_VERSION: ${PYTHON_VERSION:-3.13}
        ENVIRONMENT: ${ENVIRONMENT:-production}
    ports:
      - "8000:8000"

In poche parole, è un modo davvero semplice per avviare due applicazioni in ambienti isolati, entrambe contemporaneamente, entrambe con un set specifico di build args.

Puoi usare questo comando per eseguire il setup multi-container:

docker compose up --build

Immagine 6 - Build args con Docker Compose

Immagine 6 - Build args con Docker Compose

Dopo qualche secondo vedrai entrambi i servizi in esecuzione:

Immagine 7 - Build args con Docker Compose (2)

Immagine 7 - Build args con Docker Compose (2)

È un setup piuttosto verboso per applicazioni semplici come queste due, ma il succo è chiaro: gli argomenti di build sono impostati nel file compose e referenziati nei singoli Dockerfile.

A margine, puoi anche passare valori di variabili dal tuo ambiente ai build args, cosa utile nelle pipeline CI/CD:

services:
  web:
    build:
      context: .
      args:
        - PYTHON_VERSION=${PYTHON_VERSION:-3.10}

E per sovrascrivere questi valori quando esegui docker-compose, puoi usare le variabili d'ambiente:

PYTHON_VERSION=3.10 docker-compose up --build

Questo approccio ti permette di mantenere build coerenti in tutto il team offrendo comunque flessibilità quando necessario.

Funzionalità di BuildKit

BuildKit, il motore di build moderno di Docker, potenzia il processo di build con funzionalità che rendono l'uso dei build args ancora più efficace. Quando abiliti BuildKit (impostando DOCKER_BUILDKIT=1), sblocchi un paio di nuove capacità.

L'inline cache migliora le prestazioni sfruttando la cache di build dell'immagine remota. Puoi specificare un'immagine sorgente da usare come cache con il flag --cache-from, e BuildKit utilizzerà in modo intelligente i layer di quell'immagine:

DOCKER_BUILDKIT=1 docker build \
  --build-arg PYTHON_VERSION=3.10 \
  --cache-from flaskapp:dev \
  -t flaskapp:latest .

Un'altra funzionalità preziosa di BuildKit sono gli output deterministici, che garantiscono build riproducibili. È fondamentale quando vuoi esattamente la stessa immagine a prescindere da quando o dove venga costruita:

# Build with deterministic output
DOCKER_BUILDKIT=1 docker build \
  --build-arg PYTHON_VERSION=3.10 \
  --build-arg BUILD_DATE=2025-05-01 \
  --output type=docker,name=flaskapp:stable \
  .

L'offuscamento dei secret nei log di BuildKit protegge le informazioni sensibili durante le build. 

A differenza dei normali build args, che compaiono nei log di build, BuildKit nasconde automaticamente i valori dei secret:

# Create a file with the API key
echo "my-api-key-value" > ./api-key.txt

# Build with secret (value won't appear in logs)
DOCKER_BUILDKIT=1 docker build \
  --secret id=api_key,src=./api-key.txt \
  -t flaskapp:secure .

Nel Dockerfile, accederesti a questo secret con:

RUN --mount=type=secret,id=api_key \
    cat /run/secrets/api_key > /app/config/api_key.txt

Queste funzionalità di BuildKit lavorano insieme ai build args per creare un sistema di build più sicuro, efficiente e riproducibile, in grado di adattarsi a praticamente qualsiasi workflow di containerizzazione.

Best practice per l'adozione in azienda

Implementare i build args di Docker in team numerosi richiede approcci standardizzati, almeno se vuoi minimizzare la confusione e massimizzare i benefici in termini di sicurezza e prestazioni.

Quando adotti i build args in ambienti enterprise, parti da una corretta validazione degli argomenti. 

Fornisci sempre valori predefiniti sensati per ogni argomento di build, così le build non falliscono inaspettatamente quando gli argomenti non vengono passati. Dovresti anche aggiungere controlli di validazione nel Dockerfile per verificare che i build args critici soddisfino i requisiti.

Ecco un esempio che valida la versione di Python:

ARG PYTHON_VERSION=3.9
# Validate Python version
RUN if [[ ! "$PYTHON_VERSION" =~ ^3\.[0-9]+$ ]]; then \
      echo "Invalid Python version: ${PYTHON_VERSION}. Must be 3.x"; \
      exit 1; \
    fi

L'ottimizzazione della cache dei layer è cruciale per ridurre i tempi di build nelle pipeline CI/CD. 

Ordina le istruzioni del Dockerfile per massimizzare i cache hit, mettendo i contenuti che cambiano raramente (come l'installazione delle dipendenze) prima di quelli che cambiano spesso (come il codice applicativo). 

Quando usi build args che potrebbero cambiare spesso, posizionali dopo le operazioni stabili per evitare di invalidare l'intera cache:

FROM python:3.13-slim

WORKDIR /app

# Dependencies change less frequently - good cache utilization
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Build args that might change often come AFTER stable operations
ARG BUILD_NUMBER
ARG COMMIT_SHA
# Now these args won't invalidate the dependency cache

La gestione dei metadati tramite build args migliora la tracciabilità e la conformità. Usa i build args per iniettare metadati di build come label:

ARG BUILD_DATE
ARG VERSION
ARG COMMIT_SHA
ARG BUILD_URL

LABEL org.opencontainers.image.created="${BUILD_DATE}" Can you please provide me with access to this document?
      org.opencontainers.image.version="${VERSION}" \
      org.opencontainers.image.revision="${COMMIT_SHA}" \
      org.opencontainers.image.url="${BUILD_URL}"

Queste label standard seguono la specifica Open Container Initiative (OCI), quindi le tue immagini saranno compatibili con diversi strumenti di gestione dei container.

La documentazione è spesso trascurata, ma è fondamentale per l'adozione a livello enterprise. 

Crea una chiara sezione README che documenti tutti i build args disponibili, il loro scopo, i valori predefiniti e gli esempi d'uso. Indica quali build args sono obbligatori e quali facoltativi, e documenta eventuali interazioni tra argomenti diversi. Valuta di aggiungere queste informazioni anche nei file di configurazione della pipeline CI/CD come commenti, per aiutare gli sviluppatori a capire quali valori devono fornire:

# Example documented CI configuration
build_job:
  script:
    # BUILD_NUMBER: Unique identifier for this build (required)
    # ENVIRONMENT: Target deployment environment [dev|staging|prod] (required)
    # PYTHON_VERSION: Python version to use (optional, default: 3.9)
    - docker build
      --build-arg BUILD_NUMBER=${CI_PIPELINE_ID}
      --build-arg ENVIRONMENT=${DEPLOY_ENV}
      --build-arg PYTHON_VERSION=${PYTHON_VERSION:-3.9}
      -t myapp:${CI_PIPELINE_ID} .

Per un'adozione davvero enterprise, valuta l'implementazione di uno schema degli argomenti di build che possa essere versionato e validato. Questo approccio ti consente di evolvere la configurazione di build nel tempo mantenendo la compatibilità all'indietro.

Analisi comparativa: Build Args vs. Variabili d'ambiente

Se vuoi creare immagini Docker sicure e flessibili che seguano le best practice, devi capire quando usare i build arguments e quando usare le variabili d'ambiente.

Ecco una tabella di riferimento rapido:

Funzionalità

Build arguments

Variabili d'ambiente

Disponibilità

Disponibili solo durante la build dell'immagine

Disponibili sia in build che in runtime del container

Persistenza

Non persistono nell'immagine finale (a meno che non siano convertiti esplicitamente in ENV)

Persistono nell'immagine e sono disponibili ai container in esecuzione

Sicurezza

Visibili nella cronologia dell'immagine con docker history

Non visibili nella cronologia dell'immagine ma accessibili ai processi dentro il container

Utilizzo

Ideali per configurazioni di build-time come versioni, percorsi di build, flag del compilatore

Ideali per configurazioni di runtime come stringhe di connessione, feature flag, livelli di log

Dichiarazione

Definiti con l'istruzione ARG nel Dockerfile

Definiti con l'istruzione ENV nel Dockerfile o in runtime

Valori predefiniti

Possono avere valori di default: ARG VERSION=latest

Possono avere valori di default: ENV MODE=production

Ambito

Limitati a ciascuna fase di build, vanno ridefiniti dopo ogni FROM

Disponibili in tutte le fasi di build e ereditati dalle immagini figlie

Metodo di override

--build-arg in fase di build

-e o --env in runtime del container

La differenza chiave sta nel momento e nello scopo. I build args configurano il processo di build, mentre le variabili d'ambiente configurano l'applicazione in esecuzione. Ad esempio, useresti un build arg per scegliere quale immagine di base usare (ARG PYTHON_VERSION=3.10), ma useresti una variabile d'ambiente per dire alla tua applicazione su quale porta ascoltare (ENV PORT=8080).

Dal punto di vista della sicurezza, i build args sono più rischiosi per informazioni sensibili perché restano nella cronologia dell'immagine. 

Considera questo workflow per gestire diversi tipi di configurazione:

# Build-time configuration (non-sensitive)
ARG PYTHON_VERSION=3.13
FROM python:${PYTHON_VERSION}-slim

# Build-time secrets (use BuildKit secrets)
RUN --mount=type=secret,id=build_key \
    cat /run/secrets/build_key > /tmp/key && \
    # Use the secret for build operations
    rm /tmp/key

# Runtime configuration (non-sensitive)
ENV LOG_LEVEL=info

# Runtime secrets (should be injected at runtime, not here)
# This would be provided at runtime with:
# docker run -e API_KEY=secret123 myimage

In pratica, un pattern comune è convertire alcuni build args in variabili d'ambiente quando devono essere disponibili in runtime:

ARG APP_VERSION=1.0.0
# Make the version available at runtime
ENV APP_VERSION=${APP_VERSION}

Per applicazioni enterprise, questa separazione permette a team diversi di gestire aspetti diversi del ciclo di vita dell'applicazione. I team DevOps possono modificare i build args per la costruzione delle immagini, mentre gli operatori possono regolare le variabili d'ambiente in fase di deploy senza ricostruire le immagini.

Riepilogo sui Docker Build Args

I build args di Docker non sono solo un'altra funzionalità tecnica: sono il tuo strumento di riferimento per creare immagini che funzionano in modo coerente nel tuo team e nei vari ambienti. 

Ti ho mostrato come usarli in semplici progetti Python, mantenendo al contempo al sicuro le informazioni sensibili. Hai visto anche come integrare i build args con strumenti come Docker Compose.

Pensa ai build args come alle fondamenta di una strategia di containerizzazione flessibile. Inizia in piccolo parametrizzando la versione di Python nel tuo prossimo progetto. Quando ti sentirai a tuo agio, prova ad aggiungere logica condizionale per diversi ambienti. In breve tempo, creerai build multi-stage sofisticate che il tuo team potrà personalizzare senza modificare il Dockerfile.

Pronto a fare un passo avanti? Questi corsi di DataCamp sono il prossimo passo ideale:

FAQ

Che cosa sono i Docker build arguments?

Gli argomenti di build di Docker (build args) sono variabili che passi al processo di build di Docker e che sono disponibili solo durante la costruzione dell'immagine. Ti consentono di personalizzare il Dockerfile senza modificarlo, rendendo le build dei container più flessibili e riutilizzabili. Pensali come parametri che puoi regolare ogni volta che crei un'immagine, perfetti per gestire ambienti o configurazioni diverse.

In cosa differiscono i build args dalle variabili d'ambiente in Docker?

I build args esistono solo durante la costruzione dell'immagine, mentre le variabili d'ambiente persistono nel container in esecuzione. I build args sono definiti con l'istruzione ARG e passati tramite il flag --build-arg in fase di build, rendendoli ideali per cose come la selezione dell'immagine di base o l'impostazione di configurazioni di build-time. Le variabili d'ambiente, definite con ENV, sono pensate per la configurazione di runtime di cui la tua applicazione ha bisogno mentre è in esecuzione.

Quali aspetti di sicurezza devo considerare quando uso i Docker build args?

I build args non sono privati come molti sviluppatori pensano: i loro valori sono visibili nella cronologia dell'immagine e nei log di CI/CD. Non usare mai i build args per informazioni sensibili come chiavi API o password, perché chiunque abbia accesso all'immagine può vedere questi valori. Per i dati sensibili, usa invece i secret di Docker BuildKit, che non persistono nell'immagine finale o nella cronologia.

Come posso passare i build args tramite pipeline CI/CD come GitHub Actions?

La maggior parte delle piattaforme CI/CD supporta i build args di Docker tramite i file di configurazione. In GitHub Actions, puoi passare i build args nel workflow YAML usando il parametro build-args sotto docker/build-push-action. Puoi fare riferimento a variabili d'ambiente, secret del repository o valori hardcoded a seconda delle tue esigenze di sicurezza. Questo consente di automatizzare build con configurazioni diverse in base al branch, all'ambiente o ad altre variabili di CI.

C'è un limite al numero di build args che posso usare in un Dockerfile?

Non c'è un limite tecnico rigido al numero di build args, ma averne troppi può rendere il Dockerfile difficile da comprendere e mantenere. Per i progetti di data science, concentrati sul parametrizzare variabili critiche come la versione di Python, le scelte dei framework o le configurazioni dei dataset. Se ti ritrovi con più di 8-10 build args, valuta di suddividere il Dockerfile in file più piccoli e mirati o di usare Docker Compose per gestire la complessità.

Dario Radečić

Autore

Dario Radečić

Senior Data Scientist con base in Croazia. Top Tech Writer con oltre 700 articoli pubblicati, per più di 10 milioni di visualizzazioni. Autore del libro Machine Learning Automation with TPOT.

Argomenti

Correlato