Last chance! 50% off DataCamp Premium
Sale ends in
मैंने अनगिनत Docker इमेजेज़ को अनजाने में उजागर होते देखा है, जिनमें उनकी लेयर्स के भीतर हार्डकोडेड API keys, डेटाबेस पासवर्ड, और ऑथेंटिकेशन टोकन एम्बेड रहते हैं। ऐसे सुरक्षा उल्लंघन अक्सर बिल्ड प्रक्रिया के दौरान होते हैं, जब डेवलपर्स को निजी संसाधनों तक अस्थायी पहुंच चाहिए होती है, पर वे गलती से क्रेडेंशियल्स को फाइनल इमेज में “बेक” कर देते हैं।
समस्या यह है कि बिल्ड के दौरान क्रेडेंशियल्स संभालने के पारंपरिक तरीके, जैसे environment variables या build arguments, क्षणिक उपयोग के लिए बने ही नहीं हैं। वे इमेज मेटाडेटा या लेयर्स में स्थायी निशान छोड़ देते हैं, जिससे सुरक्षा कमजोरियां पैदा होती हैं जो बिल्ड पूरा होने के बहुत बाद तक बनी रहती हैं। यह एक दुविधा पैदा करता है: आप बिल्ड के दौरान निजी संसाधनों के लिए ऑथेंटिकेट कैसे करें, बिना सुरक्षा से समझौता किए?
Docker build secrets इस गंभीर सुरक्षा चुनौती का समाधान देते हैं, क्योंकि वे इमेज बिल्ड के दौरान संवेदनशील डेटा का उपयोग करने की व्यवस्था प्रदान करते हैं, बिना अंतिम आर्टिफैक्ट में कोई निशान छोड़े।
इस ट्यूटोरियल में, मैं आपको बुनियादी अवधारणाओं से लेकर उन्नत CI/CD इंटीग्रेशन तक, build secrets को प्रभावी ढंग से लागू करना सिखाऊंगा, ताकि आपके कंटेनर बिल्ड सुरक्षित रहें।
यदि आप Docker में नए हैं, तो मैं हमारे किसी कोर्स से शुरुआत करने की सलाह दूंगा, जैसे Introduction to Docker, Containerization and Virtualization with Docker and Kubernetes, या Intermediate Docker.
आइए समझते हैं कि build secrets अन्य क्रेडेंशियल मैनेजमेंट तरीकों से अलग कैसे हैं। Docker build secrets संवेदनशील जानकारी के क्षणिक टुकड़े होते हैं जो बिल्ड प्रक्रिया के दौरान उपलब्ध होते हैं, पर इमेज लेयर्स या फाइल सिस्टम में कभी स्टोर नहीं होते। वे केवल खास बिल्ड स्टेप्स के दौरान मेमोरी में मौजूद रहते हैं और स्टेप पूरा होते ही गायब हो जाते हैं।
Build secrets की जरूरत आधुनिक एप्लिकेशन डेवलपमेंट वर्कफ़्लोज़ से उपजी है।
आपको अक्सर बिल्ड के दौरान प्राइवेट पैकेज रिपॉज़िटरीज़ तक ऑथेंटिकेट करना, प्राइवेट Git रिपॉज़िटरीज़ क्लोन करना, लाइसेंस प्राप्त सॉफ़्टवेयर डाउनलोड करना, या इंटरनल APIs तक पहुंचना पड़ता है।
बिना build secrets के, डेवलपर्स जोखिम भरे वर्कअराउंड अपनाते हैं, जैसे Dockerfiles में क्रेडेंशियल्स हार्डकोड करना, सीक्रेट्स को build arguments के रूप में पास करना (जो इमेज मेटाडेटा में बने रहते हैं), या एम्बेडेड क्रेडेंशियल्स के साथ अत्यधिक अनुमतियों वाली बेस इमेज बनाना।
सीक्रेट्स को गलत ढंग से संभालने के जोखिम बहुत बड़े हैं। उजागर क्रेडेंशियल्स से प्रोडक्शन सिस्टम्स तक अनधिकृत पहुंच, डेटा उल्लंघन, कंप्लायंस उल्लंघन, और गंभीर साख क्षति हो सकती है। जिन सामान्य परिदृश्यों में सीक्रेट्स लीक होते हैं, उनमें पैकेज मैनेजर्स के API keys, Git ऑपरेशंस के लिए SSH keys, इंटरनल सेवाओं के ऑथेंटिकेशन टोकन, और बिल्ड-टाइम माइग्रेशन्स के लिए डेटाबेस क्रेडेंशियल्स शामिल हैं।
इम्प्लिमेंटेशन में उतरने से पहले, आपको BuildKit समझना होगा—यह आधुनिक बिल्ड इंजन है जो सुरक्षित secrets संभव बनाता है। BuildKit Docker का नेक्स्ट-जनरेशन बिल्डर है, जिसने क्लासिक बिल्ड इंजन की जगह ली है, और प्रदर्शन, कैशिंग, तथा सुरक्षा में महत्वपूर्ण सुधार प्रदान करता है।
BuildKit एक ग्राफ-आधारित निष्पादन मॉडल का उपयोग करता है जो बिल्ड स्टेप्स के बीच डिपेंडेंसीज़ को ट्रैक करता है। यह आर्किटेक्चर BuildKit को सीक्रेट्स को अस्थायी फाइल सिस्टम्स के रूप में माउंट करने देता है, जो केवल खास RUN निर्देशों के दौरान मौजूद रहते हैं, और सुनिश्चित करता है कि वे कभी इमेज लेयर्स का हिस्सा न बनें।
क्लासिक Docker बिल्ड्स के विपरीत, जहां बिल्ड कॉन्टेक्स्ट की हर चीज़ बिल्ड कैश का हिस्सा बन सकती है, BuildKit सीक्रेट्स को विशेष संसाधन मानता है जो पूरी तरह लेयर कैश को बायपास करते हैं।
BuildKit को सक्षम करना सीधा है। Docker 23.0 और बाद के संस्करणों में BuildKit डिफ़ॉल्ट बिल्डर है। पुराने संस्करणों के लिए, बिल्ड कमांड चलाने से पहले DOCKER_BUILDKIT=1 environment variable सेट करें:
export DOCKER_BUILDKIT=1
docker build -t myapp .
वैकल्पिक रूप से, Docker डेमन को कॉन्फ़िगर करके इसे स्थायी रूप से सक्षम करें या Docker Buildx का उपयोग करें, जो हमेशा BuildKit का उपयोग करता है। क्लासिक बिल्ड्स और BuildKit-सक्षम बिल्ड्स के बीच मुख्य अंतर यह है कि क्लासिक बिल्ड्स में, यदि सावधानी से प्रबंधन न किया जाए तो सीक्रेट्स इंटरमीडिएट लेयर्स में बने रह सकते हैं, जबकि BuildKit गारंटी देता है कि सीक्रेट्स क्षणिक हैं और इमेज का हिस्सा बनकर डिस्क पर कभी नहीं लिखे जाते।
BuildKit की सुरक्षित नींव के साथ, अब देखते हैं यह किन-किन प्रकार के सीक्रेट्स सक्षम करता है और हर एक को प्रभावी ढंग से कैसे लागू करें।
BuildKit बिल्ड्स के दौरान सीक्रेट्स संभालने के लिए तीन प्राथमिक तंत्र सपोर्ट करता है, जिनमें से हर एक खास उपयोग मामलों के लिए डिज़ाइन किया गया है। किस प्रकार का उपयोग कब करना है, यह समझना सर्वोत्तम सुरक्षा और फ़ंक्शनैलिटी सुनिश्चित करता है।
Secret mounts बिल्ड्स के दौरान संवेदनशील डेटा संभालने का सबसे लचीला तरीका देते हैं। ये आपको RUN निर्देशों के दौरान निर्दिष्ट पथों पर सीक्रेट्स को फाइल के रूप में माउंट करने देते हैं, जिससे क्रेडेंशियल्स बिल्ड कमांड्स को उपलब्ध हो जाते हैं, पर लेयर्स में स्थायी नहीं होते।
प्रक्रिया दो चरणों में होती है: सीक्रेट को बिल्ड कमांड को पास करना और Dockerfile में उसे माउंट करना। पहले, लोकली एक सीक्रेट फाइल बनाएं या environment variable का उपयोग करें। फिर बिल्ड के दौरान उसे संदर्भित करें:
docker build --secret id=api_key,src=./api_key.txt -t myapp .
अपने Dockerfile में, उस RUN निर्देश के दौरान सीक्रेट को माउंट करें जिसे इसकी ज़रूरत है:
RUN --mount=type=secret,id=api_key \
API_KEY=$(cat /run/secrets/api_key) && \
curl -H "Authorization: Bearer $API_KEY" https://api.example.com/package > /app/data.json
डिफ़ॉल्ट रूप से, सीक्रेट्स /run/secrets/<id> पर माउंट होते हैं, लेकिन आप target पैरामीटर से कस्टम टार्गेट्स निर्दिष्ट कर सकते हैं।
श्रेष्ठ तरीकों में केवल उन्हीं खास RUN कमांड्स में सीक्रेट्स माउंट करना शामिल है जिन्हें उनकी ज़रूरत है, सीक्रेट्स को कभी भी इमेज फाइल सिस्टम में कॉपी न करना, और मल्टी-स्टेज बिल्ड्स का उपयोग करके सीक्रेट की आवश्यकता वाले स्टेजेज़ को फाइनल इमेज से अलग रखना।
सोर्स एक फाइल पथ हो सकता है, या env का उपयोग करके environment variables से सीक्रेट्स पास करें: --secret id=token,env=API_TOKEN।
सीक्रेट को फाइल के बजाय environment variable के रूप में माउंट करने के लिए, env विकल्प का उपयोग करें:
RUN --mount=type=secret,id=db_user,env=DB_USER \
--mount=type=secret,id=db_password,env=DB_PASSWORD \
./setup-database.sh
आप target और env दोनों विकल्पों का साथ में उपयोग कर सकते हैं, ताकि एक सीक्रेट को फाइल और environment variable—दोनों रूप में माउंट किया जा सके।
श्रेष्ठ तरीकों में केवल विशिष्ट RUN कमांड्स में सीक्रेट्स माउंट करना, सीक्रेट्स को इमेज फाइल सिस्टम में कभी कॉपी न करना, और फाइनल इमेज से सीक्रेट-आवश्यक स्टेजेज़ को अलग रखने के लिए मल्टी-स्टेज बिल्ड्स का उपयोग करना शामिल है।
SSH mounts खासतौर पर SSH-आधारित ऑथेंटिकेशन संभालते हैं, मुख्य रूप से बिल्ड्स के दौरान प्राइवेट Git रिपॉज़िटरीज़ तक पहुंच के लिए। इमेज में SSH keys कॉपी करने (जो सुरक्षा के लिए बेहद खतरनाक है) के बजाय, SSH mounts बिल्ड समय में आपके SSH एजेंट तक अस्थायी पहुंच प्रदान करते हैं।
SSH mounts का उपयोग करने के लिए, सुनिश्चित करें कि आपका SSH एजेंट लोकली चल रहा है और आवश्यक keys लोड हैं। फिर अपने Dockerfile में SSH माउंट को संदर्भित करें:
RUN --mount=type=ssh \
git clone git@github.com:myorg/private-repo.git /app
SSH फ़ॉरवर्डिंग सक्षम करके इमेज बनाएं:
docker build --ssh default -t myapp .
विभिन्न keys वाले एकाधिक होस्ट्स के लिए, आप नामित SSH माउंट्स निर्दिष्ट कर सकते हैं:
RUN --mount=type=ssh,id=github \
git clone git@github.com:myorg/repo.git
फिर बिल्ड के दौरान विशिष्ट keys प्रदान करें:
docker build --ssh github=$HOME/.ssh/github_key -t myapp .
आप पाएंगे कि यह तरीका इमेज में private keys को कभी उजागर किए बिना सुरक्षा बनाए रखता है, जबकि बिल्ड प्रक्रिया के दौरान प्राइवेट रिपॉज़िटरीज़ तक ऑथेंटिकेटेड एक्सेस सक्षम करता है।
जब आपका Docker बिल्ड प्राइवेट Git रिपॉज़िटरीज़ तक पहुंच चाहता है—चाहे स्वयं बिल्ड कॉन्टेक्स्ट के रूप में या बिल्ड के दौरान डिपेंडेंसीज़ फ़ेच करते समय—तो आपको बिना क्रेडेंशियल्स एम्बेड किए ऑथेंटिकेट करने का तरीका चाहिए। यह विशेष रूप से आम है जब आप प्राइवेट रिपॉज़िटरी URL से बिल्ड कर रहे हों या ADD निर्देशों से प्राइवेट कोड फ़ेच कर रहे हों।
BuildKit Git ऑथेंटिकेशन के लिए दो प्री-डिफ़ाइंड सीक्रेट्स देता है: GIT_AUTH_TOKEN और GIT_AUTH_HEADER। ये “pre-flight” सीक्रेट्स हैं जो किसी भी Dockerfile निर्देश के चलने से पहले बिल्डर को ऑथेंटिकेट करते हैं, और शुरुआती रिपॉज़िटरी फ़ेच को सुरक्षित बनाते हैं।
सबसे आम पैटर्न टोकन-आधारित HTTPS ऑथेंटिकेशन के लिए GIT_AUTH_TOKEN का उपयोग करता है:
GIT_AUTH_TOKEN=$(cat ~/.github-token) docker build \
--secret id=GIT_AUTH_TOKEN \
https://github.com/myorg/private-repo.git
यह ADD निर्देशों के साथ प्राइवेट रिपॉज़िटरीज़ फ़ेच करते समय निर्बाध रूप से काम करता है:
FROM alpine
ADD https://github.com/myorg/private-configs.git /configs
क्षणिक CI/CD परिवेशों के लिए, अपने प्लेटफ़ॉर्म के सीक्रेट स्टोर से टोकन इंजेक्ट करें:
- name: Build from private repo
env:
GIT_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
docker build --secret id=GIT_AUTH_TOKEN https://github.com/myorg/app.git
जब मानक टोकन ऑथेंटिकेशन पर्याप्त न हो, तब GIT_AUTH_HEADER सीक्रेट कस्टम ऑथेंटिकेशन स्कीम्स के लिए एक विकल्प प्रदान करता है।
अब जब हमने build secrets के प्रकार कवर कर लिए हैं, तो देखते हैं कि उन्हें वास्तविक दुनिया के परिदृश्यों में प्रभावी ढंग से कैसे लागू करें।
सुरक्षा के लिए सीक्रेट्स की उचित तैयारी अत्यंत महत्वपूर्ण है। सीक्रेट्स को अपने Docker बिल्ड कॉन्टेक्स्ट के बाहर फाइलों में स्टोर करें, उन्हें .gitignore और .dockerignore में जोड़ें, और सख्त फाइल अनुमतियाँ (600 या 400) रखें।
एकाधिक सीक्रेट्स के लिए, एक समर्पित secrets डायरेक्टरी बनाएं:
mkdir -p .secrets
echo "my-api-key" > .secrets/api_key
chmod 600 .secrets/*
फिर उन्हें बिल्ड्स के दौरान संदर्भित करें:
docker build \
--secret id=api_key,src=.secrets/api_key \
--secret id=db_password,src=.secrets/db_password \
-t myapp .
CI/CD में आम environment variable-आधारित सीक्रेट्स के लिए:
docker build \
--secret id=api_key,env=API_KEY \
--secret id=db_pass,env=DB_PASSWORD \
-t myapp .
जब build secrets के साथ जोड़ा जाए, तो मल्टी-स्टेज बिल्ड्स बहुत शक्तिशाली होते हैं। शुरुआती स्टेजेज़ में डिपेंडेंसीज़ फ़ेच करने के लिए सीक्रेट्स का उपयोग करें, फिर केवल आवश्यक आर्टिफैक्ट्स को अंतिम स्टेज में कॉपी करें:
# Build stage - secrets used here
FROM python:3.11 AS builder
WORKDIR /app
COPY requirements.txt .
RUN --mount=type=secret,id=api_key \
API_KEY=$(cat /run/secrets/api_key) && \
curl -H "Authorization: Bearer $API_KEY" https://api.company.com/data.json -o data.json && \
pip install -r requirements.txt
# Final stage - no secrets present
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY --from=builder /app/data.json ./data.json
COPY . .
CMD ["python", "app.py"]
यह सुनिश्चित करता है कि सीक्रेट्स केवल बिल्डर स्टेज के दौरान मौजूद रहें और कभी भी फाइनल इमेज में न आएं।
मल्टी-स्टेज बिल्ड्स एकल सीक्रेट्स को बढ़िया संभालते हैं, पर वास्तविक-world एप्लिकेशंस में अक्सर अधिक जटिलता होती है।
आइए ऐसे परिदृश्यों को देखें जहां एकाधिक सीक्रेट्स या जटिल बिल्ड आवश्यकताएं हों
जटिल बिल्ड्स में अक्सर उसी RUN निर्देश के भीतर कई सीक्रेट्स की आवश्यकता होती है। BuildKit एक साथ कई सीक्रेट्स माउंट करना सपोर्ट करता है:
RUN --mount=type=secret,id=api_key \
--mount=type=secret,id=db_password \
API_KEY=$(cat /run/secrets/api_key) && \
DB_PASS=$(cat /run/secrets/db_password) && \
./configure.sh
ऐसे परिदृश्यों के लिए जहां कई कमांड्स में सीक्रेट्स चाहिए, कमांड्स को एकल RUN निर्देश में संयोजित करें ताकि सीक्रेट माउंट्स को न्यूनतम रखते हुए सुरक्षा सीमाएं बनी रहें।
Build secrets को सही ढंग से लागू करने के लिए स्थापित सुरक्षा प्रथाओं का पालन करना जरूरी है। मैं वे पैटर्न साझा कर रहा हूँ जो बिल्ड प्रक्रिया के दौरान सुरक्षा बनाए रखने में सबसे प्रभावी लगे हैं।
इमेज बनाने के बाद, इमेज लेयर्स का निरीक्षण करके सत्यापित करें कि सीक्रेट्स लीक नहीं हुए हैं:
docker history myapp:latest
docker save myapp:latest | tar -x
निकाली गई लेयर्स में किसी संवेदनशील डेटा की जांच करें। इसके अतिरिक्त, बिल्ड-टाइम सीक्रेट्स (अस्थायी, बिल्ड के दौरान उपयोग किए जाने वाले) और रनटाइम सीक्रेट्स (जब कंटेनर्स चलते हैं तब आवश्यक) में अंतर करें। रनटाइम क्रेडेंशियल्स के लिए कभी भी build secrets का उपयोग न करें। इसके बजाय Docker secrets, Kubernetes secrets, या रनटाइम पर इंजेक्ट किए गए environment variables का उपयोग करें।
हमेशा सीक्रेट फाइलों को .gitignore में जोड़ें:
# .gitignore
.secrets/
*.key
और .dockerignore में भी, ताकि वे बिल्ड कॉन्टेक्स्ट में अनजाने में शामिल न हों:
# .dockerignore
.secrets/
*.key
.env
CI/CD प्लेटफ़ॉर्म्स नेेटिव सीक्रेट मैनेजमेंट प्रदान करते हैं जो Docker build secrets के साथ सहजता से इंटीग्रेट होता है। GitHub Actions में:
- name: Build Docker image
env:
API_KEY: ${{ secrets.API_KEY }}
run: |
docker build \
--secret id=api_key,env=API_KEY \
-t myapp .
मुख्य सिद्धांत यह है कि रिपॉज़िटरीज़ में सीक्रेट्स स्टोर करने के बजाय प्लेटफ़ॉर्म-प्रदत्त सीक्रेट स्टोर्स का लाभ उठाया जाए। CI/CD सीक्रेट्स environment variables के रूप में इंजेक्ट होते हैं, जिन्हें BuildKit सीधे env सोर्स टाइप के माध्यम से उपभोग कर सकता है।
नॉन-रूट यूज़र्स के रूप में बिल्ड करते समय, सुनिश्चित करें कि सीक्रेट फाइलों पर उचित read अनुमतियाँ हों। यदि आपका Dockerfile USER का उपयोग करके नॉन-रूट यूज़र पर स्विच करता है, तो सीक्रेट्स को ऐसे लोकेशंस पर माउंट करें जो उस यूज़र के लिए सुलभ हों:
FROM python:3.11-slim
RUN useradd -m appuser
USER appuser
RUN --mount=type=secret,id=token,uid=1000 \
cat /run/secrets/token > /dev/null
उन्नत सुरक्षा अनुपालन के लिए, सीक्रेट रोटेशन रणनीतियाँ लागू करें। जहाँ संभव हो, अल्प-आयु वाले टोकन्स का उपयोग करें, CI/CD पाइपलाइन्स में स्वचालित रोटेशन लागू करें, और सीक्रेट उपयोग के ऑडिट लॉग बनाए रखें।
एक्सपोज़र विंडोज़ को न्यूनतम करने के लिए समाप्ति तिथियों वाले सीक्रेट्स और स्वचालित नवीनीकरण प्रक्रियाओं पर विचार करें।
अब तक हमने एकल-कंटेनर बिल्ड्स पर ध्यान दिया, लेकिन आधुनिक एप्लिकेशंस अक्सर अनेक सेवाओं से मिलकर बनते हैं। देखते हैं कि Docker Compose कैसे मल्टी-सर्विस आर्किटेक्चर में build secret क्षमताओं का विस्तार करता है।
Docker Compose मल्टी-सर्विस एप्लिकेशंस में build secrets का प्रबंधन सरल बनाता है। अपनी docker-compose.yml में, टॉप-लेवल पर सीक्रेट्स परिभाषित करें और उन्हें सर्विस बिल्ड कॉन्फ़िगरेशन में संदर्भित करें:
services:
app:
build:
context: .
secrets:
- api_key
- db_password
secrets:
api_key:
file: ./.secrets/api_key
db_password:
environment: DB_PASSWORD
फिर अपने Dockerfile में, हमेशा की तरह सीक्रेट्स माउंट करें:
RUN --mount=type=secret,id=api_key \
--mount=type=secret,id=db_password \
./setup.sh
Compose के साथ बिल्ड करें:
docker-compose build
यह पैटर्न उन एप्लिकेशंस के लिए अच्छी तरह स्केल करता है जिनमें कई सेवाओं को अलग-अलग सीक्रेट्स चाहिए होते हैं, और यह सेवाओं के बीच सुरक्षा सीमाएं बनाए रखते हुए केंद्रीकृत सीक्रेट प्रबंधन सुनिश्चित करता है।
जैसे-जैसे आप अपने प्रोजेक्ट्स में build secrets लागू करेंगे, आपको समस्याओं का सामना होना स्वाभाविक है। आइए सबसे सामान्य चुनौतियों और उनके समाधानों पर चर्चा करते हैं, ताकि आप प्रभावी ढंग से ट्रबलशूट कर सकें।
सही इम्प्लिमेंटेशन के बावजूद, आपको चुनौतियाँ मिलेंगी। यहाँ सबसे आम समस्याएँ और उनके समाधान दिए गए हैं।
--mount सिंटैक्स सख्त है। आम गलतियों में पैरामीटर्स के बीच कॉमा भूल जाना, पैरामीटर नाम गलत लिखना, और माउंट टाइप गलत देना शामिल है। सही सिंटैक्स है:
RUN --mount=type=secret,id=secret_name,target=/path \
command
यदि बिल्ड्स "secret not found" से फेल हों, तो सत्यापित करें कि BuildKit सक्षम है, और Dockerfile में दिया ID आपके बिल्ड कमांड के --secret id से मेल खाता है।
जब सीक्रेट्स सुलभ नहीं हों, तो सत्यापित करें कि सोर्स फाइल मौजूद है और पढ़ी जा सकती है:
cat .secrets/api_key
docker build --secret id=api_key,src=.secrets/api_key .
environment variables के लिए, पुष्टि करें कि वे सेट हैं:
echo $API_KEY
docker build --secret id=api_key,env=API_KEY .
build secrets के साथ, डिफ़ॉल्ट रूप से सीक्रेट्स हमेशा /run/secrets/<id> पर फाइल के रूप में माउंट होते हैं। उन्हें environment variable के रूप में उपयोग करने के लिए, फाइल का कंटेंट पढ़ें:
RUN --mount=type=secret,id=token \
export TOKEN=$(cat /run/secrets/token) && \
curl -H "Authorization: Bearer $TOKEN" https://api.example.com
सीक्रेट्स के लिए कभी भी build arguments (ARG) का उपयोग न करें, क्योंकि वे इमेज मेटाडेटा में बने रहते हैं।
डिज़ाइन के अनुसार सीक्रेट्स RUN निर्देशों के बीच स्थायी नहीं रहते। यदि कई RUN कमांड्स को एक ही सीक्रेट चाहिए, तो या तो उन्हें संयोजित करें या सीक्रेट को फिर से माउंट करें:
RUN --mount=type=secret,id=token \
command1
RUN --mount=type=secret,id=token \
command2
BuildKit सुनिश्चित करता है कि सीक्रेट्स कभी लेयर कैश में न जाएं।
एक बार जब आप बुनियादी बातों और सामान्य ट्रबलशूटिंग में निपुण हो जाते हैं, तो आपको अधिक परिष्कृत तरीकों की आवश्यकता वाले परिदृश्यों का सामना हो सकता है। आइए उन्नत उपयोग मामलों और edge cases का अन्वेषण करें जो मानक इम्प्लिमेंटेशन से आगे जाते हैं।
जटिल डिप्लॉयमेंट परिदृश्यों के लिए, आपको बुनियादी इम्प्लिमेंटेशन से परे अतिरिक्त बातों को संभालना होगा।
मल्टी-स्टेज CI/CD पाइपलाइन्स में अक्सर अलग-अलग स्टेजेज़ में सीक्रेट्स की आवश्यकता होती है। क्रेडेंशियल्स साझा करने के बजाय स्टेज-विशिष्ट सीक्रेट्स लागू करें। सीक्रेट स्कोपिंग के लिए CI/CD प्लेटफ़ॉर्म की सुविधाओं का उपयोग करें, ताकि कौन-से पाइपलाइन स्टेज कौन-से सीक्रेट्स तक पहुंच सकते हैं, यह सीमित रहे। एक्सपोज़र विंडोज़ को कम करने के लिए बिल्ड्स के बाद सीक्रेट क्लीनअप को स्वचालित करें।
Buildah और Kaniko जैसे वैकल्पिक बिल्डर्स में BuildKit के सीक्रेट सिंटैक्स के लिए अलग-अलग सपोर्ट होता है। Buildah --secret flags के माध्यम से समान सीक्रेट माउंटिंग सपोर्ट करता है। Kaniko, जो Kubernetes परिवेशों के लिए डिज़ाइन किया गया है, अलग तंत्र इस्तेमाल करता है—आम तौर पर Kubernetes secrets जो वॉल्यूम्स के रूप में माउंट होते हैं। नॉन-Docker बिल्डर्स उपयोग करते समय, उनकी विशिष्ट डाक्यूमेंटेशन देखें, क्योंकि इम्प्लिमेंटेशन में काफी भिन्नता होती है।
Build secrets ऑडिटेबल, क्षणिक क्रेडेंशियल एक्सेस प्रदान करके सुरक्षा अनुपालन फ़्रेमवर्क्स के साथ संरेखित होते हैं।
GDPR अनुपालन के लिए, सुनिश्चित करें कि सीक्रेट्स की वजह से लेयर्स में कोई व्यक्तिगत पहचान योग्य जानकारी लीक न हो। SOC2 आवश्यकताओं को सीक्रेट ऑडिट ट्रेल्स बनाने से लाभ होता है—लॉग रखें कि सीक्रेट्स कब और किसने उपयोग किए। अनुपालन ऑडिट्स के लिए सीक्रेट एक्सेस का रिकॉर्ड बनाए रखें।
बिल्ड्स में व्यवधान डाले बिना सीक्रेट रोटेशन के लिए प्रक्रियाएँ स्थापित करें। वर्शन किए गए सीक्रेट फाइल्स या environment variable नामकरण कन्वेंशंस अपनाएँ जो वर्शन के बीच स्विचिंग सक्षम करें।
CI/CD पाइपलाइन्स में स्वचालित रोटेशन लागू करें जहाँ सीक्रेट्स केंद्रीय स्टोर्स से रिफ्रेश होते हैं। समाप्ति तिथियों वाले टोकन्स के लिए, एक्सपायरी की निगरानी करें और नवीनीकरण प्रक्रियाओं को स्वचालित करें।
Docker build secrets कंटेनराइज़्ड एप्लिकेशन डेवलपमेंट के लिए एक मौलिक सुरक्षा सुधार हैं। पूरे ट्यूटोरियल में, हमने सीक्रेट्स को सुरक्षित रूप से लागू करना सीखा है—बेसिक secret mounts से लेकर जटिल CI/CD इंटीग्रेशन तक।
मुख्य निष्कर्ष सरल हैं: build arguments या हार्डकोडेड क्रेडेंशियल्स की जगह हमेशा BuildKit के secret mounting तंत्रों का उपयोग करें, सीक्रेट-उपयोग करने वाले स्टेजेज़ को फाइनल इमेज से अलग करने के लिए मल्टी-स्टेज बिल्ड्स लागू करें, स्वचालित वर्कफ़्लोज़ के लिए CI/CD प्लेटफ़ॉर्म के सीक्रेट मैनेजमेंट का लाभ लें, और नियमित रूप से इमेजेज़ का ऑडिट करें ताकि सत्यापित हो सके कि सीक्रेट्स लेयर्स में लीक नहीं हुए हैं।
इन प्रथाओं को अपनाने वाले संगठनों के लिए, एक सीक्रेट मैनेजमेंट नीति से शुरुआत करें जो परिभाषित करे कि किन सीक्रेट्स को बिल्ड-टाइम एक्सेस चाहिए, स्वचालित रोटेशन शेड्यूल स्थापित करें, व्यापक परीक्षण लागू करें ताकि सीक्रेट्स इमेज में स्थायी न रहें, और विकास टीमों को उचित सीक्रेट हैंडलिंग पैटर्न पर प्रशिक्षित करें। build secrets को एक महत्वपूर्ण सुरक्षा घटक मानकर, आप अपने अटैक सरफेस को काफी घटा देंगे और अधिक सुरक्षित कंटेनराइज़्ड एप्लिकेशंस बनाएंगे।
सीखना जारी रखने के लिए, मैं निम्न संसाधनों को देखने की सलाह देता हूँ:
Docker build secrets बिल्ड प्रक्रिया के दौरान उपलब्ध कराई गई संवेदनशील जानकारी के क्षणिक टुकड़े होते हैं, जो इमेज लेयर्स में कभी स्टोर नहीं होते और खास बिल्ड स्टेप्स के दौरान केवल मेमोरी में मौजूद रहते हैं।
Docker तीन प्रकार सपोर्ट करता है: सामान्य-उद्देश्य संवेदनशील डेटा के लिए secret mounts, प्राइवेट Git रिपॉज़िटरी एक्सेस के लिए SSH mounts, और प्राइवेट रिमोट कॉन्टेक्स्ट्स के लिए Git ऑथेंटिकेशन सीक्रेट्स (GIT_AUTH_TOKEN और GIT_AUTH_HEADER)।
BuildKit के --mount=type=secret सिंटैक्स का RUN निर्देशों में उपयोग करें और मल्टी-स्टेज बिल्ड्स अपनाएँ; सीक्रेट्स के लिए कभी build arguments या environment variables न इस्तेमाल करें; और नियमित रूप से docker history से इमेज ऑडिट करें, ताकि कोई लीक न हो।
हाँ, Docker Compose आपके compose फाइल में secrets सेक्शन के माध्यम से build secrets सपोर्ट करता है, जिससे आप टॉप-लेवल पर सीक्रेट्स परिभाषित कर सकते हैं और उन्हें सर्विस बिल्ड कॉन्फ़िगरेशन में संदर्भित कर सकते हैं।
CI/CD प्लेटफ़ॉर्म्स सीक्रेट्स को environment variables के रूप में इंजेक्ट करते हैं, जिन्हें --secret id=name,env=VARIABLE_NAME से Docker बिल्ड्स में पास किया जा सकता है—इससे बिना रिपॉज़िटरी में क्रेडेंशियल्स स्टोर किए स्वचालित वर्कफ़्लोज़ संभव होते हैं।
Martin Data Solutions के संस्थापक और एक फ्रीलांस डेटा वैज्ञानिक, ML और AI इंजीनियर के रूप में, मेरे पास रिग्रेशन, क्लासिफिकेशन, NLP, LLM, RAG, न्यूरल नेटवर्क्स, एंसेंबल मेथड्स, और कंप्यूटर विज़न में विविध अनुभव है।
हर प्रोजेक्ट में, मैं सॉफ्टवेयर इंजीनियरिंग और DevOps की नवीनतम प्रथाओं—जैसे CI/CD, कोड लिंटिंग, फॉर्मेटिंग, मॉडल मॉनिटरिंग, एक्सपेरिमेंट ट्रैकिंग, और मजबूत एरर हैंडलिंग—का पालन करता हूँ। मैं संपूर्ण समाधान प्रदान करने के लिए प्रतिबद्ध हूँ, जो डेटा इनसाइट्स को व्यावहारिक रणनीतियों में बदलते हैं, ताकि व्यवसाय बढ़ें और डेटा साइंस, मशीन लर्निंग और AI का अधिकतम लाभ उठा सकें।
शीर्ष DataCamp कोर्स
कोर्स
कोर्स
लर्निंग पाथ