Last chance! 50% off DataCamp Premium
Sale ends in
क्या आपकी डेवलपमेंट टीम में Docker बिल्ड्स असंगत हो रहे हैं? Build arguments शायद वही हैं जिसकी आपको तलाश है। ये लचीली और मानकीकृत Docker इमेज बनाने का पसंदीदा समाधान हैं। ये आपको बिल्ड प्रक्रिया में मान Inject करने देते हैं बिना हार्डकोड किए, जिससे आपके Dockerfiles अधिक पोर्टेबल और मेंटेन करने में आसान बनते हैं।
Docker build args सामान्य समस्याओं का समाधान करते हैं, जैसे अलग-अलग बेस इमेज, पैकेज वर्ज़न, या वातावरणों के बीच कॉन्फ़िगरेशन सेटिंग्स हैंडल करना।
Docker के आधिकारिक दस्तावेज़ build args को बिल्ड्स को पैरामीट्राइज़ करने के लिए सलाह देते हैं, वातावरण वेरिएबल्स का गलत उपयोग करने के बजाय। ये खासकर CI/CD पाइपलाइनों में काफ़ी उपयोगी हैं जहाँ आपको एक ही Dockerfile से अलग-अलग कॉन्फ़िगरेशन वाली इमेज बनानी होती हैं।
> Docker और कंटेनरs में नए हैं? हमारा गाइड पढ़ें और जल्दी से गति पकड़ें।
इस लेख में, मैं आपको दिखाऊंगा कि अधिक कुशल, सुरक्षित और लचीले कंटेनराइज़ेशन वर्कफ़्लो बनाने के लिए Docker build arguments का उपयोग कैसे करें।
Build arguments (या build args) वेरिएबल्स हैं जिन्हें आप बिल्ड टाइम पर Docker को पास करते हैं, और ये केवल इमेज निर्माण प्रक्रिया के दौरान उपलब्ध रहते हैं।
रनटाइम पर कंटेनर में बने रहने वाले environment variables के विपरीत, build args सिर्फ docker build कमांड के संदर्भ के भीतर मौजूद होते हैं और इमेज बनते ही समाप्त हो जाते हैं। ये फ़ंक्शन पैरामीटर्स की तरह काम करते हैं, जिससे आप हर बार इमेज बनाते समय अलग-अलग मान दे सकते हैं।
Build args का मुख्य उपयोग लचीले, पुन: प्रयोज्य Dockerfiles बनाने के आसपास घूमता है।
आप build args का उपयोग अलग-अलग बेस इमेज निर्दिष्ट करने के लिए कर सकते हैं (जैसे Alpine या Debian के बीच स्विच करना), अपने Dockerfile को बदले बिना एप्लिकेशन वर्ज़न सेट करना, या प्रॉक्सी सर्वर या रिपॉज़िटरी URLs जैसी बिल्ड-टाइम सेटिंग्स कॉन्फ़िगर करना। यह लचीलापन CI/CD पाइपलाइनों में तब काम आता है जब आप डिप्लॉयमेंट टार्गेट के आधार पर एक ही Dockerfile को अलग-अलग पैरामीटर्स के साथ बनाते हैं।
Build args उन स्थितियों में बेहतरीन हैं जहाँ आपको कई Dockerfile वेरिएंट्स मेंटेन किए बिना अपने बिल्ड्स को कस्टमाइज़ करना हो। ये आपको DRY (Don't Repeat Yourself) सिद्धांत का पालन करने में मदद करते हैं, जिससे कंटेनर कॉन्फ़िगरेशन लॉजिक केंद्रीकृत रहता है और फिर भी कस्टमाइज़ेशन संभव होता है।
ये डेवलपमेंट, टेस्टिंग और प्रोडक्शन वातावरणों के बीच के अंतर को संभालने के लिए भी उपयुक्त हैं, जो केवल इमेज के बनने के तरीके को प्रभावित करते हैं, कंटेनर के चलने के तरीके को नहीं।
अब जब आप जान गए हैं कि build args क्या हैं, तो मैं आपको इन्हें उपयोग करना सिखाता हूँ।
अब आइए build arguments को लागू करने के व्यावहारिक पहलुओं पर हाथ गंदे करें। यह मानकर चला गया है कि आपने Docker इंस्टॉल और कॉन्फ़िगर कर लिया है।
आप अपने Dockerfile में ARG निर्देश का उपयोग करके build arguments घोषित कर सकते हैं, जो FROM निर्देश से पहले या बाद में आ सकता है—इस पर निर्भर करता है कि आपको उनकी आवश्यकता कब है। यहाँ बेसिक सिंटैक्स है:
# Setting a build arg with a default value
ARG VERSION=latest
# Using the build arg
FROM ubuntu:${VERSION}
आप इमेज बनाते समय --build-arg फ़्लैग का उपयोग करके मान प्रदान कर सकते हैं:
docker build --build-arg VERSION=20.04 -t myapp:20.04 .

छवि 1 - बेसिक Docker build args
Build args का स्कोप कुछ विशिष्ट नियमों का पालन करता है जिन्हें समझना आवश्यक है। FROM निर्देश से पहले घोषित किए गए args केवल FROM से पहले उपलब्ध होते हैं और यदि बाद में उनकी ज़रूरत हो तो उन्हें फिर से घोषित करना पड़ता है।
ऐसा इसलिए होता है क्योंकि प्रत्येक FROM निर्देश अपना अलग स्कोप वाला एक नया बिल्ड स्टेज शुरू करता है। यह व्यवहार याद रखना अधिक या कम अनिवार्य है, खासकर मल्टी-स्टेज बिल्ड्स में।
आइए एक पूर्ण Flask "Hello World" एप्लिकेशन बनाते हैं जो अलग-अलग कॉन्फ़िगरेशन को सपोर्ट करने के लिए build args का उपयोग करता है:
> जानें कि Docker का उपयोग करके किसी एप्लिकेशन को कंटेनराइज़ कैसे करें।
पहले, एक साधारण 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)
यहीं रहते हुए, एक requirements.txt फ़ाइल भी बनाएं:
flask==3.1.0
अब एक Dockerfile बनाते हैं जो लचीली कॉन्फ़िगरेशन के लिए build args का उपयोग करता है:
# 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"]
> क्या ऊपर का Dockerfile उलझान लग रहा है? हमारे गाइड से Docker शून्य से सीखें।
डेवलपमेंट के लिए किसी विशिष्ट Python संस्करण के साथ इस इमेज को बनाने हेतु, टर्मिनल से निम्न कमांड चलाएँ:
# Building for development with Python 3.11
docker build \
--build-arg PYTHON_VERSION=3.11 \
--build-arg ENVIRONMENT=development \
-t flaskapp:dev .

छवि 2 - एक बेसिक Python एप्लिकेशन में build args
मल्टी-स्टेज बिल्ड्स में, build args को विशेष तरीके से संभालने की आवश्यकता होती है। यहाँ हमारे Flask ऐप के साथ कई स्टेज के बीच arguments पास करने का पूरा उदाहरण है:
# 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"]
अब आप इसे विशिष्ट Python संस्करण और वातावरण के साथ बना सकते हैं:
docker build \
--build-arg PYTHON_VERSION=3.12 \
--build-arg ENVIRONMENT=staging \
-t flaskapp:staging .

छवि 3 - मल्टी-स्टेज बिल्ड्स में build args
संक्षेप में, यह तरीका आपके बिल्ड के सभी स्टेज में एकसमान कॉन्फ़िगरेशन बनाए रखने देता है।
Docker कई पूर्वनिर्धारित build args प्रदान करता है जिनका आप बिना पहले घोषित किए उपयोग कर सकते हैं। ये हैं:
HTTP_PROXY और HTTPS_PROXY: कॉर्पोरेट वातावरणों में प्रॉक्सी सर्वर के साथ बिल्ड्स के लिए उपयोगी।FTP_PROXY: HTTP प्रॉक्सी के समान, लेकिन FTP कनेक्शनों के लिए।NO_PROXY: वे होस्ट निर्दिष्ट करता है जिन्हें प्रॉक्सी को बायपास करना चाहिए।BUILD_DATE और VCS_REF: प्रायः इमेज मेटाडेटा और वर्ज़निंग के लिए उपयोग किए जाते हैं।ये पूर्वनिर्धारित args तब उपयोगी हैं जब आप विशिष्ट नेटवर्क कॉन्फ़िगरेशन वाले वातावरणों में इमेज बना रहे हों। उदाहरण के लिए, कड़े प्रॉक्सी आवश्यकताओं वाले कॉर्पोरेट नेटवर्क में, आप उपयोग कर सकते हैं:
docker build --build-arg HTTP_PROXY=http://proxy.example.com:8080 .
यह तरीका आपके Dockerfile को पोर्टेबल रखता है, जबकि प्रतिबंधित वातावरणों में भी काम करता है।
भले ही build arguments लचीलापन प्रदान करते हैं, वे संभावित सुरक्षा जोखिम भी लाते हैं जिन्हें आपको अपनी Docker इमेज को सुरक्षित रखने के लिए समझना जरूरी है।
Build arguments उतने निजी नहीं हैं जितना आप सोच सकते हैं। build args के मान कई ऐसे वेक्टरों से लीक हो सकते हैं जिन्हें कई डेवलपर्स नज़रअंदाज़ कर देते हैं। सबसे पहले, Docker इमेज हिस्ट्री आपके सभी build args उजागर करती है, यानी आपकी इमेज तक पहुंच वाले कोई भी व्यक्ति docker history चलाकर बिल्ड टाइम पर उपयोग किए गए मान देख सकता है—जिसमें API keys या tokens जैसी संवेदनशील जानकारी भी शामिल हो सकती है।
docker history flaskapp:dev

छवि 4 - Docker हिस्ट्री
इंटरमीडिएट लेयर्स भी build arguments लीक कर सकती हैं। भले ही आप मल्टी-स्टेज बिल्ड का उपयोग करें और संवेदनशील जानकारी वाली लेयर को कॉपी न करें, फिर भी बिल्ड मशीन पर लेयर कैश में build arg के मान बने रहते हैं। इसका अर्थ है कि आपके बिल्ड सर्वर पर Docker डेमन तक पहुंच रखने वाला कोई भी व्यक्ति संभवतः इस जानकारी को निकाल सकता है।
CI/CD लॉग्स एक और महत्वपूर्ण जोखिम हैं। अधिकांश CI/CD सिस्टम संपूर्ण बिल्ड कमांड लॉग करते हैं, जिसमें कमांड लाइन पर पास किए गए build args भी शामिल होते हैं।
उदाहरण के लिए, यह पूरी कमांड, जिसमें API_KEY भी शामिल है, CI/CD लॉग्स में दिखाई देगी:
docker build --build-arg API_KEY=secret123 -t myapp:latest .
ये लॉग्स अक्सर डेवलपर्स के व्यापक समूह के लिए सुलभ होते हैं या यहाँ तक कि थर्ड-पार्टी सिस्टम्स में संग्रहीत होते हैं, जिससे संवेदनशील मानों के एक्सपोज़र की संभावना बढ़ जाती है।
संवेदनशील जानकारी के लिए, आपको build args के बजाय Docker BuildKit की secrets सुविधा का उपयोग करना चाहिए। BuildKit आपको बिल्ड प्रक्रिया के दौरान सीक्रेट्स माउंट करने देता है, बिना उन्हें अंतिम इमेज या हिस्ट्री में बनाए रखने के।
यहाँ Docker BuildKit secrets का उपयोग करने वाला एक उदाहरण Dockerfile है:
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"]
इस इमेज को किसी सीक्रेट के साथ बनाने के लिए, पहले api_key.txt फ़ाइल बनाएं:
echo "my-secret-api-key" > api_key.txt
और फिर सीक्रेट के साथ इमेज बनाएं:
DOCKER_BUILDKIT=1 docker build \
--secret id=api_key,src=api_key.txt \
-t flaskapp:secure .

छवि 5 - BuildKit सीक्रेट्स के साथ इमेज बनाना
ऐसी कॉन्फ़िगरेशन के लिए जो रनटाइम पर उपलब्ध होनी चाहिए, environment variables पसंदीदा तरीका बने रहते हैं। इन्हें कंटेनर शुरू करते समय सेट किया जा सकता है, बिना इमेज में बेक किए हुए:
# Set environment variables at runtime
docker run -e API_KEY=secret123 -p 5000:5000 flaskapp:latest
प्रोडक्शन में संवेदनशील कॉन्फ़िगरेशन को सुरक्षित रूप से हैंडल करने के लिए, Kubernetes जैसे कंटेनर ऑर्केस्ट्रेशन प्लेटफॉर्म्स का उपयोग करने पर विचार करें, जो Secrets जैसी सुरक्षित विधियाँ प्रदान करते हैं। Docker Swarm भी अपने सीक्रेट्स मैनेजमेंट के साथ समान क्षमताएँ देता है।
> Docker अकेला कंटेनराइज़ेशन प्लेटफॉर्म नहीं है। Podman के बारे में पढ़ें और जानें कि कौन सा टूल आपके लिए बेहतर है।
याद रखें, thumb का नियम यह है: गैर-संवेदनशील बिल्ड-टाइम कॉन्फ़िगरेशन के लिए build args का उपयोग करें, संवेदनशील बिल्ड-टाइम आवश्यकताओं के लिए BuildKit secrets का उपयोग करें, और रनटाइम कॉन्फ़िगरेशन के लिए environment variables या ऑर्केस्ट्रेशन प्लेटफॉर्म के secrets का उपयोग करें।
अब जब बुनियादी बातें हो गई हैं, तो देखते हैं कि व्यापक Docker इकोसिस्टम और आधुनिक बिल्ड टूल्स के भीतर build arguments का लाभ कैसे उठाया जाए।
Docker Compose आपकी मल्टी-कंटेनर एप्लिकेशंस में build arguments को परिभाषित और साझा करना आसान बनाता है।
यदि आप साथ चलना चाहते हैं, तो यहाँ दो सरल 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
मैं फ़ाइलों की सामग्री पर एक-एक करके जल्दी नज़र डालूंगा:
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"
संक्षेप में, यह दोनों एप्लिकेशंस को अलग-अलग वातावरणों में, एक साथ, और एक विशिष्ट build args सेट के साथ शुरू करने का बहुत सरल तरीका है।
आप इस कमांड का उपयोग मल्टी-कंटेनर सेटअप चलाने के लिए कर सकते हैं:
docker compose up --build

छवि 6 - Docker Compose के साथ build args
कुछ सेकंड के बाद, आप दोनों सेवाओं को चलते हुए देखेंगे:

छवि 7 - Docker Compose के साथ build args (2)
ये दोनों एप्लिकेशन जितने सरल हैं, उसके लिए यह सेटअप काफ़ी वर्बोज़ है, लेकिन मूल बात स्पष्ट है—build arguments compose फ़ाइल में सेट होते हैं और व्यक्तिगत Dockerfiles में संदर्भित होते हैं।
एक साइड नोट पर, आप अपने environment से भी build args में वेरिएबल मान पास कर सकते हैं, जो CI/CD पाइपलाइनों के लिए सहायक है:
services:
web:
build:
context: .
args:
- PYTHON_VERSION=${PYTHON_VERSION:-3.10}
और docker-compose चलाते समय इन मानों को ओवरराइड करने के लिए, आप environment variables का उपयोग कर सकते हैं:
PYTHON_VERSION=3.10 docker-compose up --build
यह तरीका आपकी टीम में एकसमान बिल्ड्स बनाए रखते हुए, ज़रूरत पड़ने पर लचीलापन भी प्रदान करता है।
BuildKit, Docker का आधुनिक बिल्ड इंजन, आपके बिल्ड प्रोसेस को ऐसी सुविधाओं के साथ सुपरचार्ज करता है जो build args के उपयोग को और भी शक्तिशाली बना देती हैं। जब आप BuildKit सक्षम करते हैं ( DOCKER_BUILDKIT=1 सेट करके), तो आप कुछ नई क्षमताएँ अनलॉक करते हैं।
Inline cache रिमोट इमेज के बिल्ड कैश का लाभ उठाकर बिल्ड प्रदर्शन में सुधार करती है। आप --cache-from फ़्लैग के साथ किसी सोर्स इमेज को कैश के रूप में निर्दिष्ट कर सकते हैं, और BuildKit उस इमेज की लेयर्स को बुद्धिमानी से उपयोग करेगा:
DOCKER_BUILDKIT=1 docker build \
--build-arg PYTHON_VERSION=3.10 \
--cache-from flaskapp:dev \
-t flaskapp:latest .
BuildKit की एक और मूल्यवान सुविधा है deterministic outputs, जो सुनिश्चित करती है कि आपके बिल्ड्स पुनरुत्पाद्य हों। यह तब महत्वपूर्ण है जब आप चाहते हैं कि जहाँ या जब भी बिल्ड हो, इमेज बिल्कुल एक जैसी बने:
# 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 \
.
BuildKit के लॉग्स में secret redaction बिल्ड्स के दौरान संवेदनशील जानकारी की रक्षा करता है.
सामान्य build args के विपरीत, जो बिल्ड लॉग्स में दिखाई देते हैं, BuildKit स्वतः ही सीक्रेट्स के मान छुपा देता है:
# 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 .
अपने Dockerfile में, आप इस सीक्रेट तक यूँ पहुँचेंगे:
RUN --mount=type=secret,id=api_key \
cat /run/secrets/api_key > /app/config/api_key.txt
ये BuildKit सुविधाएँ build args के साथ मिलकर एक अधिक सुरक्षित, कुशल और पुनरुत्पाद्य बिल्ड सिस्टम बनाती हैं जो लगभग किसी भी कंटेनराइज़ेशन वर्कफ़्लो के अनुरूप ढल सकता है।
बड़ी टीमों में Docker build arguments को लागू करने के लिए मानकीकृत दृष्टिकोणों की आवश्यकता होती है—कम-से-कम अगर आप भ्रम को न्यूनतम और सुरक्षा व प्रदर्शन लाभों को अधिकतम करना चाहते हैं।
एंटरप्राइज़ वातावरणों में build args अपनाते समय, उचित आर्ग्युमेंट वैलिडेशन से शुरुआत करें।
हमेशा हर build argument के लिए समझदारी भरे डिफॉल्ट मान प्रदान करें ताकि आर्ग्युमेंट पास न होने पर बिल्ड्स अनपेक्षित रूप से फेल न हों। आपको अपने Dockerfile के भीतर वैलिडेशन चेक भी जोड़ने चाहिए ताकि महत्वपूर्ण build args आपकी आवश्यकताओं को पूरा करें।
यहाँ 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
लेयर कैशिंग ऑप्टिमाइज़ेशन CI/CD पाइपलाइनों में बिल्ड समय कम करने के लिए महत्वपूर्ण है.
अपने Dockerfile निर्देशों को इस तरह ऑर्डर करें कि कैश हिट्स अधिकतम हों—कम बदलने वाली सामग्री (जैसे डिपेंडेंसी इंस्टॉलेशन) को अधिक बदलने वाली सामग्री (जैसे एप्लिकेशन कोड) से पहले रखें।
जब आप ऐसे build args का उपयोग कर रहे हों जो अक्सर बदल सकते हैं, तो उन्हें स्थिर ऑपरेशंस के बाद रखें ताकि पूरा कैश अमान्य न हो:
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
Build args के माध्यम से मेटाडेटा मैनेजमेंट ट्रेसएबिलिटी और कम्प्लायंस में सुधार करता है। बिल्ड-टाइम मेटाडेटा को लेबल्स के रूप में इंजेक्ट करने के लिए build args का उपयोग करें:
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}"
ये मानकीकृत लेबल Open Container Initiative (OCI) स्पेसिफ़िकेशन का पालन करते हैं, यानी आपकी इमेज अलग-अलग कंटेनर मैनेजमेंट टूल्स के साथ संगत रहेंगी।
डॉक्युमेंटेशन को अक्सर नज़रअंदाज़ कर दिया जाता है, लेकिन एंटरप्राइज़ अपनाने के लिए यह महत्वपूर्ण है.
एक स्पष्ट README सेक्शन बनाएँ जो सभी उपलब्ध build args, उनका उद्देश्य, डिफॉल्ट मान और उपयोग के उदाहरणों को डॉक्यूमेंट करे। यह भी शामिल करें कि कौन से build args आवश्यक हैं और कौन से वैकल्पिक, और अलग-अलग आर्ग्युमेंट्स के बीच किसी भी इंटरैक्शन को डॉक्यूमेंट करें। डेवलपर्स की मदद के लिए इस जानकारी को अपनी CI/CD पाइपलाइन कॉन्फ़िगरेशन फ़ाइलों में टिप्पणियों के रूप में जोड़ने पर भी विचार करें, ताकि वे समझ सकें कि उन्हें कौन से मान प्रदान करने हैं:
# 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} .
वास्तव में एंटरप्राइज़-ग्रेड अपनाने के लिए, एक ऐसा build argument स्कीमा लागू करने पर विचार करें जिसे वर्शन किया जा सके और वैलिडेट किया जा सके। यह तरीका आपको समय के साथ अपने बिल्ड कॉन्फ़िगरेशन को विकसित करने देता है, जबकि बैकवर्ड कम्पैटिबिलिटी बनाए रखता है।
यदि आप सर्वोत्तम प्रथाओं का पालन करते हुए सुरक्षित और लचीली Docker इमेज बनाना चाहते हैं, तो आपको समझना होगा कि build arguments कब उपयोग करने हैं और environment variables कब।
यहाँ एक तालिका है जिसे आप कभी भी संदर्भित कर सकते हैं:
|
फ़ीचर |
Build arguments |
Environment variables |
|
उपलब्धता |
केवल इमेज बिल्ड के दौरान उपलब्ध |
बिल्ड और कंटेनर रनटाइम—दोनों के दौरान उपलब्ध |
|
स्थायित्व |
अंतिम इमेज में संरक्षित नहीं (जब तक कि स्पष्ट रूप से |
इमेज में संरक्षित और चल रहे कंटेनरों में उपलब्ध |
|
सुरक्षा |
docker history के साथ इमेज हिस्ट्री में दिखाई देते हैं |
इमेज हिस्ट्री में दिखाई नहीं देते, पर कंटेनर के अंदर की प्रक्रियाओं के लिए सुलभ |
|
उपयोग |
बिल्ड-टाइम कॉन्फ़िगरेशन जैसे वर्ज़न, बिल्ड पाथ, कंपाइलर फ्लैग्स के लिए आदर्श |
रनटाइम कॉन्फ़िगरेशन जैसे कनेक्शन स्ट्रिंग्स, फीचर फ्लैग्स, लॉग लेवल्स के लिए आदर्श |
|
घोषणा |
|
|
|
डिफॉल्ट मान |
डिफॉल्ट मान दे सकते हैं: |
डिफॉल्ट मान दे सकते हैं: |
|
स्कोप |
प्रत्येक बिल्ड स्टेज तक सीमित; हर |
सभी बिल्ड स्टेजेज़ में उपलब्ध और चाइल्ड इमेज द्वारा इनहेरिटेड |
|
ओवरराइड तरीका |
|
|
मुख्य अंतर इस समय और उद्देश्य में निहित है। Build args बिल्ड प्रक्रिया को कॉन्फ़िगर करते हैं, जबकि environment variables चल रहे एप्लिकेशन को। उदाहरण के लिए, आप किस बेस इमेज का उपयोग करना है यह चुनने के लिए build arg का उपयोग करेंगे (ARG PYTHON_VERSION=3.10), लेकिन आपकी एप्लिकेशन किस पोर्ट पर सुने यह बताने के लिए environment variable का (ENV PORT=8080)।
सुरक्षा के दृष्टिकोण से, build args अधिक जोखिम पैदा करते हैं संवेदनशील जानकारी के लिए क्योंकि वे इमेज हिस्ट्री में रहते हैं।
विभिन्न प्रकार की कॉन्फ़िगरेशन को हैंडल करने के लिए इस वर्कफ़्लो पर विचार करें:
# 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
व्यवहार में, एक सामान्य पैटर्न यह है कि जिन build args को रनटाइम पर उपलब्ध होना है, उन्हें environment variables में बदल दिया जाए:
ARG APP_VERSION=1.0.0
# Make the version available at runtime
ENV APP_VERSION=${APP_VERSION}
एंटरप्राइज़ एप्लिकेशंस के लिए, यह विभाजन विभिन्न टीमों को एप्लिकेशन के लाइफसायकल के अलग-अलग पहलुओं को मैनेज करने देता है। DevOps टीमें इमेज कंस्ट्रक्शन के लिए build args में बदलाव कर सकती हैं, जबकि ऑपरेटर्स बिना इमेज को फिर से बनाए डिप्लॉयमेंट के दौरान environment variables समायोजित कर सकते हैं।
Docker build args कोई साधारण तकनीकी फीचर नहीं हैं—ये आपकी टीम और वातावरणों में एकसमान रूप से काम करने वाली इमेज बनाने के लिए आपका पसंदीदा उपकरण हैं।
मैंने आपको दिखाया कि कैसे इन्हें सरल Python प्रोजेक्ट्स में उपयोग करें, साथ ही अपनी संवेदनशील जानकारी को सुरक्षित रखें। आपने यह भी देखा कि Docker Compose जैसे टूल्स के साथ build args को कैसे इंटीग्रेट करें।
build args को लचीली कंटेनराइज़ेशन रणनीति की नींव के रूप में सोचें। अपने अगले प्रोजेक्ट में Python वर्ज़न को पैरामीट्राइज़ करके छोटा शुरू करें। जब यह सहज लगे, तो अलग-अलग वातावरणों के लिए कंडीशनल लॉजिक जोड़कर देखें। देखते ही देखते, आप परिष्कृत मल्टी-स्टेज बिल्ड्स बनाएँगे जिन्हें आपकी टीम Dockerfile बदले बिना कस्टमाइज़ कर सकेगी।
और गहराई में जाना चाहते हैं? DataCamp के ये कोर्स आपका अगला बेहतरीन पड़ाव हैं:
Docker build arguments (build args) वे वेरिएबल्स हैं जिन्हें आप Docker बिल्ड प्रक्रिया को पास करते हैं और जो केवल इमेज निर्माण के दौरान उपलब्ध रहते हैं। ये आपको Dockerfile बदले बिना उसे कस्टमाइज़ करने देते हैं, जिससे आपके कंटेनर बिल्ड अधिक लचीले और पुन: प्रयोज्य बनते हैं। इन्हें ऐसे पैरामीटर्स समझें जिन्हें आप हर बार इमेज बनाते समय समायोजित कर सकते हैं—अलग-अलग वातावरणों या कॉन्फ़िगरेशन को हैंडल करने के लिए उपयुक्त।
Build args केवल इमेज निर्माण के दौरान मौजूद रहते हैं, जबकि environment variables चल रहे कंटेनर में बने रहते हैं। Build args को Dockerfile में ARG निर्देश से परिभाषित किया जाता है और बिल्ड करते समय --build-arg फ़्लैग से पास किया जाता है—इन्हें बेस इमेज चुनने या बिल्ड-टाइम कॉन्फ़िगरेशन सेट करने जैसी चीज़ों के लिए आदर्श बनाता है। Environment variables, ENV के साथ परिभाषित, रनटाइम कॉन्फ़िगरेशन के लिए बने हैं जिनकी एप्लिकेशन को चलने के दौरान आवश्यकता होती है।
Build args उतने निजी नहीं हैं जितना कई डेवलपर्स मानते हैं—उनके मान इमेज हिस्ट्री और CI/CD लॉग्स में दिखाई देते हैं। API keys या पासवर्ड जैसी संवेदनशील जानकारी के लिए build args का कभी उपयोग न करें, क्योंकि आपकी इमेज तक पहुंच वाला कोई भी व्यक्ति इन मानों को देख सकता है। संवेदनशील डेटा के लिए Docker BuildKit secrets का उपयोग करें, जो अंतिम इमेज या हिस्ट्री में संरक्षित नहीं होते।
अधिकांश CI/CD प्लेटफ़ॉर्म्स अपने कॉन्फ़िगरेशन फ़ाइलों के माध्यम से Docker build args को सपोर्ट करते हैं। GitHub Actions में, आप workflow YAML में docker/build-push-action के तहत build-args पैरामीटर का उपयोग करके build args पास कर सकते हैं। आप अपनी सुरक्षा आवश्यकताओं के अनुसार environment variables, repository secrets, या हार्डकोडेड मानों का संदर्भ दे सकते हैं। यह आपको ब्रांच, वातावरण, या अन्य CI वेरिएबल्स के आधार पर अलग-अलग कॉन्फ़िगरेशन के साथ बिल्ड्स ऑटोमेट करने देता है।
build args की संख्या पर कोई सख्त तकनीकी सीमा नहीं है, पर बहुत अधिक होने से आपका Dockerfile समझने और मेंटेन करने में कठिन हो सकता है। डेटा साइंस प्रोजेक्ट्स के लिए, Python वर्ज़न, फ्रेमवर्क विकल्प, या डेटासेट कॉन्फ़िगरेशन जैसे महत्वपूर्ण वेरिएबल्स को पैरामीट्राइज़ करने पर ध्यान दें। यदि आपके पास 8-10 से अधिक build args हो रहे हैं, तो अपने Dockerfile को छोटे, अधिक फोकस्ड फ़ाइलों में बाँटने या जटिलता प्रबंधित करने के लिए Docker Compose का उपयोग करने पर विचार करें।
इन कोर्स के साथ Docker के बारे में और जानें!
कोर्स
कोर्स
लर्निंग पाथ