Accéder au contenu principal

Docker Build Args : Le guide ultime pour les professionnels des données

Apprenez à dynamiser votre flux de travail de conteneurisation avec les arguments de construction Docker pour des environnements flexibles, sécurisés et cohérents.
Actualisé 18 mai 2025  · 11 min de lecture

Êtes-vous aux prises avec des builds Docker incohérents au sein de votre équipe de développement ? Les arguments de construction sont peut-être ce que vous recherchez. Il s'agit d'une solution de choix pour créer des images Docker flexibles et standardisées. Ils vous permettent d'injecter des valeurs dans votre processus de construction sans les coder en dur, ce qui rend vos Dockerfiles plus portables et plus faciles à maintenir.

Les args de construction Docker résolvent des problèmes courants, tels que la gestion des différentes images de base, des versions de paquets ou des paramètres de configuration dans les différents environnements.

La documentation officielle de Docker recommande les build args pour paramétrer les builds plutôt que d'abuser des variables d'environnement. Ils sont particulièrement utiles dans les pipelines CI/CD où vous devez créer des images avec différentes configurations à partir du même fichier Docker.

> Nouveau dans Docker et les conteneurss ? Suivez notre guide pour vous familiariser rapidement avec le système.

Dans cet article, je vais vous montrer comment utiliser les arguments de construction de Docker pour créer des flux de conteneurisation plus efficaces, plus sûrs et plus flexibles.

Introduction aux arguments de construction de Docker

Les arguments de construction (ou build args) sont des variables quevous transmettez à Docker au moment de la construction, et ils ne sont disponibles que pendant le processus de construction de l'image.

Contrairement aux variables d'environnement qui persistent dans le conteneur au moment de l'exécution, les arguments de construction n'existent que dans le contexte de la commande docker build et disparaissent une fois que votre image est créée. Ils fonctionnent de la même manière que les paramètres de fonction, ce qui vous permet d'injecter des valeurs différentes à chaque fois que vous construisez une image.

Les principaux cas d'utilisation des build args tournent autour de la création de Dockerfiles flexibles et réutilisables. 

Vous pouvez utiliser les args de construction pour spécifier différentes images de base (comme basculer entre Alpine et Debian), définir les versions des applications sans modifier votre fichier Docker, ou configurer les paramètres de construction comme les serveurs proxy ou les URLs de dépôt. Cette flexibilité est très utile dans les pipelines CI/CDoù vous pouvez construire le même fichier Docker avec différents paramètres en fonction de la cible de déploiement.

Les args de construction sont utiles dans les situations où vous avez besoin de personnaliser vos constructions sans avoir à maintenir plusieurs variantes de fichiers Docker. Ils vous aident à suivre le principe DRY (Don't Repeat Yourself) en centralisant la logique de configuration de votre conteneur tout en permettant la personnalisation. 

Ils sont également parfaits pour gérer les différences entre les environnements de développement, de test et de production qui ne devraient affecter que la façon dont l'image est construite, et non la façon dont le conteneur s'exécute.

Maintenant que vous savez ce que sont les "build args", laissez-moi vous montrer comment les utiliser.

Définir et utiliser les arguments de construction

Passons maintenant aux aspects pratiques de la mise en œuvre des arguments de compilation. Nous supposons que vousavez installé et configuré Docker.

Syntaxe de base et champ d'application

Vous pouvez déclarer des arguments de construction dans votre fichier Docker à l'aide de l'instruction ARG, qui peut apparaître avant ou après l'instruction FROM, selon le moment où vous devez les utiliser. Voici la syntaxe de base :

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

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

Vous pouvez fournir des valeurs lors de la construction de l'image en utilisant le drapeau --build-arg:

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

Image 1 - Arguments de base pour la construction de Docker

Image 1 - Arguments de base pour la construction de Docker

La portée des args de construction suit des règles spécifiques qu'il est essentiel de comprendre. Les arguments déclarés avant l'instruction FROM ne sont disponibles qu'avant FROM et doivent être redéclarés par la suite si vous en avez besoin plus tard. 

Cela se produit parce que chaque instruction FROM démarre une nouvelle étape de construction avec son propre champ d'application. Il est plus ou moins obligatoire de se souvenir de ce comportement, en particulier dans les constructions en plusieurs étapes.

Techniques avancées de déclaration

Créons une application Flask "Hello World" complète qui utilise des args de compilation pour prendre en charge différentes configurations :

> Apprenez à conteneuriser une application à l'aide de Docker.

Tout d'abord, créez une application Flask simple (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)

Pendant ce temps, créez également un fichier requirements.txt:

flask==3.1.0

Créons maintenant un fichier Docker qui utilise les args de construction pour une configuration flexible :

# 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"]

> Le fichier Docker ci-dessus vous semble-t-il confus ? Apprenez Docker à partir de zéro avec notre guide.

Pour construire cette image pour le développement avec une version spécifique de Python, vous pouvez exécuter ce qui suit depuis votre Terminal :

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

Image 2 - Construire des args dans une application Python de base

Image 2 - Construire des args dans une application Python de base

Dans les constructions en plusieurs étapes, les args de construction nécessitent un traitement particulier. Voici un exemple complet montrant comment passer des arguments à travers plusieurs étapes avec notre application 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"]

Vous pouvez maintenant construire ceci avec la version et l'environnement spécifiques de Python :

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

Image 3 - Arguments de construction dans les constructions en plusieurs étapes

Image 3 - Arguments de construction dans les constructions en plusieurs étapes

En bref, cette approche vous permet de maintenir une configuration cohérente à toutes les étapes de votre construction.

Arguments de construction prédéfinis

Docker fournit plusieurs args de construction prédéfinis que vous pouvez utiliser sans les déclarer au préalable. Il s'agit de

  • HTTP_PROXY et HTTPS_PROXY: Utile pour les constructions dans des environnements d'entreprise avec des serveurs proxy.
  • FTP_PROXY: Similaire aux proxys HTTP mais pour les connexions FTP.
  • NO_PROXY: Spécifie les hôtes qui doivent contourner le proxy.
  • BUILD_DATE et VCS_REF: Souvent utilisé pour les métadonnées et les versions d'images.

Ces paramètres prédéfinis sont pratiques lorsque vous créez des images dans des environnements avec des configurations réseau spécifiques. Par exemple, dans un réseau d'entreprise avec des exigences strictes en matière de proxy, vous pouvez utiliser :

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

Cette approche permet à votre fichier Docker d'être portable tout en fonctionnant dans des environnements restreints.

Maîtriser Docker et Kubernetes

Apprenez la puissance de Docker et Kubernetes avec un cursus interactif pour construire et déployer des applications dans des environnements modernes.
Démarrer le cursus gratuitement

Implications en matière de sécurité et atténuation des risques

Bien que les arguments de construction offrent de la flexibilité, ils introduisent également des risques de sécurité potentiels que vous devez comprendre pour garder vos images Docker sécurisées.

Vecteurs de fuite d'arguments

Les arguments en faveur de la construction ne sont pas aussi privés que vous le pensez. Les valeurs des args de compilation peuvent fuir à travers plusieurs vecteurs que de nombreux développeurs négligent. Tout d'abord, l'historique de l'image Docker expose tous vos args de construction, ce qui signifie que toute personne ayant accès à votre image peut exécuter docker history pour voir les valeurs que vous avez utilisées pendant la construction, y compris des informations potentiellement sensibles telles que les clés d'API ou les jetons.

docker history flaskapp:dev

Image 4 - Historique de Docker

Image 4 - Historique de Docker

Les couches intermédiaires peuvent également laisser échapper des arguments de construction. Même si vous utilisez une compilation en plusieurs étapes et que vous ne copiez pas la couche contenant des informations sensibles, les valeurs arg de la compilation restent dans le cache de la couche sur la machine de compilation. Cela signifie que toute personne ayant accès au démon Docker sur votre serveur de construction peut potentiellement extraire ces informations.

Les journaux CI/CD présentent un autre risque important. La plupart des systèmes CI/CD enregistrent l'intégralité de la commande de compilation, y compris les arguments de compilation transmis sur la ligne de commande.

Par exemple, l'ensemble de cette commande, y compris API_KEY, sera visible dans les journaux de CI/CD :

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

Ces journaux sont souvent accessibles à un groupe plus large de développeurs ou même stockés dans des systèmes tiers, ce qui augmente la surface d'exposition des valeurs sensibles.

Alternatives sécurisées

Pour les informations sensibles, vous devriez utiliser la fonction secrets de Docker BuildKit au lieu des args de construction. BuildKit vous permet de monter des secrets pendant le processus de construction sans les persister dans l'image finale ou dans l'historique.

Voici un exemple de fichier Docker qui utilise les secrets de 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"]

Pour construire cette image avec un secret, créez d'abord le fichier api_key.txt:

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

Ensuite, construisez l'image avec le secret :

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

Image 5 - Construire des images avec les secrets de BuildKit

Image 5 - Construire des images avec les secrets de BuildKit

Pour la configuration qui doit être disponible au moment de l'exécution, les variables d'environnement restent l'approche préférée. Ils peuvent être définis au démarrage d'un conteneur sans être intégrés à l'image :

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

Pour gérer en toute sécurité une configuration sensible en production, envisagez d'utiliser des plateformes d'orchestration de conteneurs comme Kubernetes, qui proposent des méthodes sécurisées comme Secrets pour gérer les informations sensibles. Docker Swarm offre également des capacités similaires avec sa gestion des secrets.

> Docker n'est pas la seule plateforme de conteneurisation. Lisez Podman pour savoir quel outil est le mieux adapté à votre situation.

Rappelez-vous, la règle de base est la suivante : utilisez les args de compilation pour la configuration de la compilation qui n'est pas sensible, utilisez les secrets BuildKit pour les besoins sensibles de la compilation, et utilisez les variables d'environnement ou les secrets de la plateforme d'orchestration pour la configuration de l'exécution.

Intégration avec les écosystèmes de conteneurs

Maintenant que les bases sont posées, explorons comment exploiter les arguments de construction dans les écosystèmes Docker plus larges et les outils de construction modernes.

Docker Compose

Docker Compose facilite la définition et le partage des arguments de construction dans vos applications multi-conteneurs.

Si vous voulez suivre, voici une structure de projet complète pour deux services Flask simples :

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

Je vais passer rapidement en revue le contenu des fichiers un par un :

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"

En bref, il s'agit d'un moyen très simple de démarrer deux applications dans des environnements isolés, toutes les deux en même temps, toutes les deux avec un ensemble spécifique d'arguments de construction.

Vous pouvez utiliser cette commande pour exécuter la configuration multi-conteneurs :

docker compose up --build

Image 6 - Construire des args avec Docker Compose

Image 6 - Construire des args avec Docker Compose

Après quelques secondes, vous verrez les deux services fonctionner :

Image 7 - Construire des args avec Docker Compose (2)

Image 7 - Construire des args avec Docker Compose (2)

C'est une configuration assez verbeuse pour des applications aussi simples que ces deux-là, mais vous avez une vue d'ensemble - les arguments de construction sont définis dans le fichier compose et référencés dans les Dockerfiles individuels.

Par ailleurs, vous pouvez également passer des valeurs variables de votre environnement aux args de construction, ce qui est pratique pour les pipelines CI/CD :

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

Pour remplacer ces valeurs lors de l'exécution de docker-compose, vous pouvez utiliser des variables d'environnement :

PYTHON_VERSION=3.10 docker-compose up --build

Cette approche vous permet de maintenir des constructions cohérentes au sein de votre équipe tout en offrant une certaine flexibilité en cas de besoin.

Caractéristiques de BuildKit

BuildKit, le moteur de construction moderne de Docker, renforce votre processus de construction avec des fonctionnalités qui rendent l'utilisation des args de construction encore plus puissante. Lorsque vous activez BuildKit (en définissant DOCKER_BUILDKIT=1), vous débloquez quelques nouvelles fonctionnalités.

Le cache en ligne améliore les performances de construction en exploitant le cache de construction de l'image distante. Vous pouvez spécifier une image source à utiliser comme cache avec l'option --cache-from, et BuildKit utilisera intelligemment les couches de cette image :

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

Les sorties déterministes, qui garantissent la reproductibilité de vos constructions, constituent une autre fonctionnalité précieuse de BuildKit. C'est essentiel lorsque vous souhaitez obtenir exactement la même image, quel que soit le moment ou l'endroit où elle est construite :

# 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 \
  .

La rédaction secrète des journaux de BuildKit protège les informations sensibles pendant la construction. 

Contrairement aux args de compilation classiques, qui apparaissent dans les journaux de compilation, BuildKit cache automatiquement les valeurs des secrets :

# 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 .

Dans votre fichier Docker, vous accédez à ce secret avec :

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

Ces fonctionnalités de BuildKit travaillent ensemble avec les args de construction pour créer un système de construction plus sûr, plus efficace et plus reproductible qui peut s'adapter à pratiquement n'importe quel flux de travail de conteneurisation.

Meilleures pratiques pour l'adoption par les entreprises

La mise en œuvre d'arguments de construction Docker au sein de grandes équipes nécessite des approches standardisées, du moins si vous souhaitez minimiser la confusion et maximiser les avantages en termes de sécurité et de performance.

Lorsque vous adoptez des arguments de compilation dans des environnements d'entreprise, commencez par une validation correcte des arguments. 

Fournissez toujours des valeurs par défaut raisonnables pour chaque argument de construction afin de vous assurer que les constructions n'échouent pas de manière inattendue lorsque les arguments ne sont pas fournis. Vous devez également ajouter des contrôles de validation dans votre fichier Docker pour vérifier que les paramètres de construction critiques répondent à vos exigences.

Voici un exemple qui valide la version de 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'optimisation de la mise en cache des couches est cruciale pour réduire les délais de construction dans les pipelines CI/CD. 

Ordonnez les instructions de votre fichier Docker pour maximiser le nombre de visites dans le cache en plaçant le contenu rarement modifié (comme l'installation de dépendances) avant le contenu fréquemment modifié (comme le code de l'application). 

Lorsque vous utilisez des args de construction susceptibles de changer souvent, placez-les après des opérations stables afin d'éviter d'invalider l'ensemble du 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 gestion des métadonnées par le biais des args de construction améliore la traçabilité et la conformité. Utilisez les args de construction pour injecter des métadonnées de construction sous forme d'étiquettes :

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}"

Ces étiquettes normalisées suivent les spécifications de l'Open Container Initiative (OCI), ce qui signifie que vos images seront compatibles avec différents outils de gestion de conteneurs.

La documentation est souvent négligée, mais elle est essentielle à l'adoption par les entreprises. 

Créez une section README claire qui documente tous les args de compilation disponibles, leur objectif, leurs valeurs par défaut et des exemples d'utilisation. Indiquez quels arguments de construction sont obligatoires ou facultatifs, et documentez les interactions entre les différents arguments. Pensez à ajouter ces informations aux fichiers de configuration de votre pipeline CI/CD sous forme de commentaires, afin d'aider les développeurs à comprendre quelles valeurs ils doivent fournir :

# 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} .

Pour une adoption au niveau de l'entreprise, envisagez de mettre en œuvre un schéma d'arguments de construction qui peut être versionné et validé. Cette approche vous permet de faire évoluer votre configuration de construction au fil du temps tout en conservant une compatibilité ascendante.

Analyse comparative : Args de construction vs. Variables d'environnement

Si vous souhaitez créer des images Docker sécurisées et flexibles qui respectent les meilleures pratiques, vous devez comprendre quand utiliser les arguments de construction et quand utiliser les variables d'environnement.

Voici un tableau que vous pouvez consulter à tout moment :

Fonctionnalité

Construire des arguments

Variables d'environnement

Disponibilité

Uniquement disponible lors de la construction de l'image

Disponible à la fois pendant la construction et l'exécution du conteneur

Persistance

Ne persiste pas dans l'image finale (sauf si elle est explicitement convertie en ENV)

Persisté dans l'image et disponible pour les conteneurs en cours d'exécution

Sécurité

Visible dans l'historique de l'image avec docker history

Non visible dans l'historique de l'image mais accessible aux processus à l'intérieur du conteneur

Utilisation

Idéal pour la configuration au moment de la construction, comme les versions, les chemins de construction, les drapeaux du compilateur.

Idéal pour la configuration de l'exécution, comme les chaînes de connexion, les drapeaux de fonctionnalité, les niveaux de journalisation.

Déclaration

Défini avec l'instruction ARG dans Dockerfile

Défini avec l'instruction ENV dans le fichier Docker ou au moment de l'exécution.

Valeurs par défaut

Peut fournir des valeurs par défaut : ARG VERSION=latest

Peut fournir des valeurs par défaut : ENV MODE=production

Champ d'application

Adapté à chaque étape de construction, doit être redéclaré après chaque étape de construction. FROM

Disponible à tous les stades de la construction et hérité par les images enfants

Remplacer la méthode

--build-arg pendant la période de construction

-e ou --env au moment de l'exécution du conteneur

La différence essentielle réside dans le moment et l'objectif.La différence essentielle réside dans le calendrier et l'objectif. Les arguments de construction configurent le processus de construction lui-même, tandis que les variables d'environnement configurent l'application en cours d'exécution. Par exemple, vous utiliserez un argument de construction pour sélectionner l'image de base à utiliser (ARG PYTHON_VERSION=3.10), mais vous utiliserez une variable d'environnement pour indiquer à votre application le port sur lequel elle doit écouter (ENV PORT=8080).

Du point de vue de la sécurité, build args présentent un risque plus élevé pour les informations sensibles car elles restent dans l'historique de l'image.

Considérez ce flux de travail pour traiter les différents types de configuration :

# 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

Dans la pratique, un schéma courant consiste à convertir les arguments de compilation sélectionnés en variables d'environnement lorsqu'ils doivent être disponibles au moment de l'exécution :

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

Pour les applications d'entreprise, la séparation permet à différentes équipes de gérer différents aspects du cycle de vie de l'application. Les équipesDevOpspeuvent modifier les paramètres de construction des images, tandis que les opérateurs peuvent ajuster les variables d'environnement pendant le déploiement sans reconstruire les images.

Récapitulation des arguments de construction de Docker

Les args de construction Docker ne sont pas simplement une autre fonctionnalité technique - ils sont votre outil de référence pour créer des images qui fonctionnent de manière cohérente au sein de votre équipe et de vos environnements. 

J'ai expliqué comment les utiliser dans des projets Python simples, tout en protégeant vos informations sensibles. Vous avez également vu comment intégrer des args de construction avec des outils comme Docker Compose.

Considérez les args de construction comme la base d'une stratégie de conteneurisation flexible. Commencez modestement en paramétrant votre version de Python dans votre prochain projet. Une fois que vous vous sentez à l'aise, essayez d'ajouter une logique conditionnelle pour différents environnements. En un rien de temps, vous créerez des constructions sophistiquées en plusieurs étapes que votre équipe pourra personnaliser sans modifier le fichier Docker.

Prêt à approfondir ? Ces cours de DataCamp sont votre meilleur prochain arrêt :

Maîtriser Docker et Kubernetes

Apprenez la puissance de Docker et Kubernetes avec un cursus interactif pour construire et déployer des applications dans des environnements modernes.

FAQ

Quels sont les arguments de construction de Docker ?

Les arguments de construction de Docker (build args) sont des variables que vous passez au processus de construction de Docker et qui ne sont disponibles que pendant la construction de l'image. Ils vous permettent de personnaliser votre fichier Docker sans le modifier, ce qui rend vos constructions de conteneurs plus flexibles et réutilisables. Considérez-les comme des paramètres que vous pouvez ajuster à chaque fois que vous construisez une image, parfaits pour gérer différents environnements ou configurations.

En quoi les args de construction diffèrent-ils des variables d'environnement dans Docker ?

Les paramètres de construction n'existent que pendant la construction de l'image, tandis que les variables d'environnement persistent dans le conteneur en cours d'exécution. Les args de construction sont définis avec l'instruction ARG et transmis via le drapeau --build-arg lors de la construction, ce qui les rend idéaux pour des choses comme la sélection des images de base ou la configuration du temps de construction. Les variables d'environnement, définies à l'aide de ENV, sont destinées à la configuration de l'exécution dont votre application a besoin pendant qu'elle fonctionne.

Quels sont les problèmes de sécurité auxquels je dois faire attention lorsque j'utilise les arcs de construction de Docker ?

Les paramètres de construction ne sont pas aussi confidentiels que le pensent de nombreux développeurs : leurs valeurs sont visibles dans l'historique des images et dans les journaux CI/CD. N'utilisez jamais d'arguments de construction pour des informations sensibles telles que des clés d'API ou des mots de passe, car toute personne ayant accès à votre image peut voir ces valeurs. Pour les données sensibles, utilisez plutôt les secrets Docker BuildKit, qui ne persistent pas dans l'image finale ou l'historique.

Comment puis-je passer des args de construction à travers des pipelines CI/CD comme GitHub Actions ?

La plupart des plateformes CI/CD prennent en charge les args de construction Docker via leurs fichiers de configuration. Dans les actions GitHub, vous pouvez passer des args de construction dans votre workflow YAML en utilisant le paramètre build-args sous docker/build-push-action. Vous pouvez faire référence à des variables d'environnement, à des secrets de dépôt ou à des valeurs codées en dur, en fonction de vos besoins en matière de sécurité. Cela vous permet d'automatiser les constructions avec différentes configurations basées sur la branche, l'environnement ou d'autres variables de CI.

Y a-t-il une limite au nombre d'arguments de construction que je peux utiliser dans un fichier Docker ?

Il n'y a pas de limite technique au nombre d'args de compilation, mais un nombre trop élevé peut rendre votre fichier Docker difficile à comprendre et à maintenir. Pour les projets de science des données, concentrez-vous sur le paramétrage des variables critiques comme la version de Python, les choix de framework ou les configurations de jeux de données. Si vous vous retrouvez avec plus de 8 à 10 args de construction, envisagez de diviser votre fichier Docker en fichiers plus petits et plus ciblés ou d'utiliser Docker Compose pour gérer la complexité.


Dario Radečić's photo
Author
Dario Radečić
LinkedIn
Scientifique de données senior basé en Croatie. Rédacteur technique de premier plan avec plus de 700 articles publiés, générant plus de 10 millions de vues. Auteur du livre Machine Learning Automation with TPOT.
Sujets

Apprenez-en plus sur Docker avec ces cours !

Cursus

Containerization and Virtualization with Docker and Kubernetes

13 hr
Learn the power of Docker and Kubernetes, this interactive track will allow you to build and deploy applications in modern environments.
Afficher les détailsRight Arrow
Commencer le cours
Voir plusRight Arrow
Apparenté

blog

Architecture de l'entrepôt de données : Tendances, outils et techniques

Apprenez l'essentiel de l'architecture d'un entrepôt de données, des composants clés aux meilleures pratiques, pour construire un système de données évolutif et efficace !
Kurtis Pykes 's photo

Kurtis Pykes

15 min

blog

Les 50 meilleures questions et réponses d'entretien sur AWS pour 2025

Un guide complet pour explorer les questions d'entretien AWS de base, intermédiaires et avancées, ainsi que des questions basées sur des situations réelles.
Zoumana Keita 's photo

Zoumana Keita

15 min

blog

Q2 2023 DataCamp Donates Digest

DataCamp Donates a offert plus de 20k bourses d'études à nos partenaires à but non lucratif au deuxième trimestre 2023. Découvrez comment des apprenants défavorisés et assidus ont transformé ces opportunités en réussites professionnelles qui ont changé leur vie.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

blog

2022-2023 Rapport annuel DataCamp Classrooms

À l'aube de la nouvelle année scolaire, DataCamp Classrooms est plus motivé que jamais pour démocratiser l'apprentissage des données, avec plus de 7 650 nouveaux Classrooms ajoutés au cours des 12 derniers mois.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

8 min

blog

Les 20 meilleures questions d'entretien pour les flocons de neige, à tous les niveaux

Vous êtes actuellement à la recherche d'un emploi qui utilise Snowflake ? Préparez-vous à répondre à ces 20 questions d'entretien sur le flocon de neige pour décrocher le poste !
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

15 min

blog

Célébration de Saghar Hazinyar : Une boursière de DataCamp Donates et une diplômée de Code to Inspire

Découvrez le parcours inspirant de Saghar Hazinyar, diplômée de Code to Inspire, qui a surmonté les défis en Afghanistan et s'est épanouie grâce à une bourse de DataCamp Donates.
Fereshteh Forough's photo

Fereshteh Forough

4 min

Voir plusVoir plus