2.4 · الإعداد : ENV وARG وملفات .env

المستوى 2 · Dockerfile وبناء الصور

2.4الإعداد : ENV وARG وملفات .env

الهدف: جعل صورة قابلة للإعداد دون إعادة بنائها، من التطوير إلى الإنتاج.
الوقت المقدّر: 11 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • ARG تبني، وENV تنفّذ : تعيش ARG أثناء البناء ثم تختفي، وتبقى ENV في الحاوية — لا تخلط بينهما.
  • افتراضيات سليمة + تجاوز : تعمل الصورة دون شيء ويتجاوز كل بيئة عند التشغيل — صورة واحدة، وN بيئات.
  • الأسرار خارج الصورة : بنية مُصدَرة (.env.example)، والقيم الحساسة خارج git — أبدا كلمة مرور مُصدَرة.

حالة مستمرة — إدير ومنفذا الصورة الواحدة

صورة إدير المرقمة بالإصدار (2.3) تعمل، لكن التطوير يستمع على 3000 والاستقبال على 8080 : وكان الفريق يعيد بناء صورة لكل بيئة. أعلن إدير ENV PORT=3000 افتراضيا في Dockerfile : فتعمل الصورة دون شيء. ثم تجاوز عند الإطلاق (-e PORT=8080) : فاستجابت حاويتان من نفس الصورة 1.0 كل على منفذها. وبقي مفتاح البناء (ARG) محصورا في البناء. وفي 2.5، سيتحقق إدير أنه لم يبقَ أي متغير حساس مجمدا في الصورة.

تتمة الخيط الرابط 2.3 : نفس صورة إدير تخدم كل البيئات — وتستمر في 2.5.

1. ENV مقابل ARG : زمنان

تخدم ARG أثناء البناء (إصدار للتجميع، يُمرَّر عبر --build-arg)، ثم تختفي : فلا توجد عند التشغيل. وتبقى ENV في الحاوية الحية (منفذ، ووضع، ورابط قاعدة) وتبقى قابلة للتجاوز عند run -e. والقاعدة : ARG تبني، وENV تنفّذ. مرّر إدير إصدار البناء في ARG ومنفذ الاستماع في ENV.

2. القيم الافتراضية المساعدة

نعلن افتراضيات سليمة في Dockerfile (ENV PORT=3000 NODE_ENV=production) : فتعمل الصورة دون شيء. وتتجاوز كل بيئة عند الإطلاق (-e PORT=8080). فصورة تتطلب عشرة متغيرات غامضة دون افتراضيات صورة سيئة التصميم : أسماء صريحة، وموثقة، وافتراضيات تعمل. شغّل إدير حاويتين من نفس الصورة بمنفذي PORT : فاستجابت كل على منفذها.

3. ملف .env : الإعداد المُصدَر دون أسرار

في Compose (المستوى 3)، يمركز ملف .env المتغيرات لكل بيئة. والمبدأ : البنية مُصدَرة (.env.example بالأسماء والافتراضيات غير الحساسة)، والقيم الحساسة تبقى خارج git (ملف محلي غير مُصدَر، ومدير أسرار، ومتغيرات CI). أبدا كلمة مرور مُصدَرة، وأبدا سر مجمّد في ENV داخل الصورة : فهو ظاهر في السجل. صدّر إدير المثال وأبقى القيم الحساسة خارج المستودع.

خطأ شائع في الفهم: « أضع كلمة المرور في ENV داخل Dockerfile، فهذا إعداد ». لا : فـ ENV المجمّد أثناء البناء يبقى مقروءا في السجل ويرحل مع push — فلم يعد إعدادا، بل تسريبا. وقاعدة إدير : ضبط بسيط في ENV مع افتراضيات سليمة، وأسرار تُحقَن عند التشغيل (أو عبر أسرار مُدارة)، ولا تُصدَّر أبدا.
صورة واحدة، وN بيئات افتراضيات سليمة في الصورة، وتجاوز عند الإطلاق ENV افتراضي تعملالصورة دون شيءrun -e يتجاوز كل بيئةتضبط عند الإطلاق.env لكل بيئة بنيةمُصدَرة، وأسرار خارج git
افتراضيات سليمة في الصورة، وتجاوز عند الإطلاق
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) يعلن إدير : ENV PORT=3000 افتراضيا في Dockerfile — فتعمل الصورة دون تجاوز ؛ وARG محفوظة لقيم البناء. 2) يتجاوز : -e PORT=8080 عند التشغيل لأجل الاستقبال، دون إعادة بناء — نفس الصورة 1.0، ومنفذان. 3) يرتّب : البنية في .env.example مُصدَر، والقيم الحساسة خارج git (ملف محلي، وأسرار مُدارة). الدرس : الإعداد يسافر خارج الصورة، والأسرار لا تمسّها أبدا.

🔎 مثال ملموس — 🔎 مثال ملموس — نفس الصورة، ومنفذان

صورة إدير، قابلة للإعداد دون إعادة بناء :

# ملف Dockerfile
FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
ENV PORT=3000 NODE_ENV=production
EXPOSE 3000
CMD ["sh", "-c", "node server.js --port $PORT"]

docker run -d -p 3000:3000 mon-app:1.0
docker run -d -p 8080:8080 -e PORT=8080 mon-app:1.0

القراءة : نفس الصورة 1.0 تخدم بيئتين : افتراضي 3000، وتجاوز 8080 عند الإطلاق.

الدرس : الإعداد يسافر خارج الصورة — فلا نعيد البناء لتغيير منفذ.

مفردات القسم

ARG
متغير بناء، متاح أثناء docker build فقط (عبر --build-arg)، وغائب عند التشغيل.

مثال بسيط: مرّر إدير الإصدار للتجميع في ARG أثناء البناء.

ما ليس كذلك: متغير تنفيذ مثبّت.

رد فعل: قيمة البناء = ARG.

ENV
متغير تنفيذ، مثبّت في الحاوية الحية، مع افتراضي سليم قابل للتجاوز عند التشغيل.

مثال بسيط: أعلن إدير ENV PORT=3000، وتجاوزه إلى 8080 عند التشغيل.

ما ليس كذلك: متغير يختفي بعد البناء.

رد فعل: ضبط الحي = ENV.

-e
تجاوز متغير عند docker run : فتضبط البيئة دون إعادة بناء الصورة.

مثال بسيط: شغّل إدير الاستقبال عبر -e PORT=8080 على نفس الصورة.

ما ليس كذلك: إعادة تجميع لتغيير ضبط.

رد فعل: الضبط = -e عند الإطلاق.

افتراضي سليم
قيمة ENV تجعل الصورة تعمل دون أي تجاوز ؛ وهي أساس الصورة حسنة التصميم.

مثال بسيط: تبدأ صورة إدير في 3000 دون أي خيار.

ما ليس كذلك: عشرة متغيرات غامضة مطلوبة دون افتراضيات.

رد فعل: تعمل دون شيء أولا.

في التطبيق — عمليا — قابلة للإعداد في 10 دقائق

  1. أضف ENV PORT=3000 إلى Dockerfile وأعد البناء.
  2. شغّل حاويتين من نفس الصورة بمنفذي PORT مختلفين (-e).
  3. تحقق أن كل واحدة تستجيب على منفذها.
  4. اسرد المتغيرات المرئية من الداخل (exec + env).
صورة واحدة تخدم كل بيئاتك بتجاوز بسيط.

نص جاهز — بِع الإعداد دون إعادة بناء (30 ثانية)

« صورة واحدة 1.0 لكل البيئات : افتراضيا تستمع على 3000، ويتجاوز الاستقبال إلى 8080 عند الإطلاق، دون إعادة بناء. والضبط البسيط يسافر في ENV، ويبقى مفتاح البناء في ARG، والأسرار أبدا في الصورة. نفس الإصدار في كل مكان، فقط الإعداد يتغير. »

يُقال مع تشغيل حاويتي إدير جنبا إلى جنب، نفس الصورة ومنفذان.

قالب جاهز للنسخ — Dockerfile قابل للإعداد (ARG + ENV)

FROM node:20-slim
ARG APP_VERSION=1.0
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
ENV PORT=3000 NODE_ENV=production APP_VERSION=${APP_VERSION}
EXPOSE 3000
CMD ["sh", "-c", "node server.js --port $PORT"]

ARG مختفية

إصدار مقروء عند التشغيل لكن مُمرَّر في ARG : فارغ عند البدء — فيعيد إدير نسخه في ENV إن احتاجه الحي.

عشرة متغيرات غامضة

صورة تتطلب عشرة -e دون افتراضيات : فيضيف إدير افتراضيات سليمة ويوثّق كل اسم.

سر في ENV مجمّد

كلمة مرور في ENV داخل Dockerfile، ظاهرة في history : فيزيلها إدير ويحقنها عند التشغيل.

.env مُصدَّر

ملف .env بقيم حساسة مدفوع على git : فيصدّر إدير .env.example ويُبقي القيم خارج المستودع.

✓ ممارسات جيدة

  • افتراضيات تعمل دون شيء.
  • أسماء متغيرات صريحة وموثقة.
  • الأسرار خارج git، دائما.

✗ أخطاء شائعة

  • وضع سر في ENV مُصدَر (ظاهر في history).
  • الخلط بين ARG وENV (مختفية عند التشغيل).
  • طلب عشرة متغيرات غامضة دون افتراضيات.

النقاط الأساسية

  • ARG = البناء (تختفي)، وENV = التشغيل (تبقى وتُتجاوَز).
  • افتراضيات سليمة، وتجاوز عند الإطلاق (-e).
  • صورة واحدة، وN بيئات : فلا نعيد البناء لأجل ضبط.
  • الأسرار خارج الصورة وخارج git (بنية مُصدَرة، وقيم محمية).

تحدي 48 ساعة — طبِّق غدا

اجعل صورتك 1.0 قابلة للإعداد : ENV PORT افتراضي، وحاويتان ومنفذان (-e)، ومراقبة exec + env في الداخل، و.env.example دون أي قيمة حساسة.

قائمة الخروج من القسم
  • أستطيع تمييز ARG (البناء) وENV (التشغيل) ووضعهما صحيحا.
  • أعرف خدمة N بيئات بصورة واحدة (افتراضيات + -e).
  • أُبقي البنية مُصدَرة والأسرار خارج git وخارج الصورة.
تقييم ذاتي 1-5 : هل تعمل صورتي دون تجاوز؟هل لا ينام أي سر في Dockerfile أو سجلي؟

أسئلة شائعة

أين أضع كلمة مرور قاعدة؟

لا في Dockerfile ولا في الصورة : بل متغيرا عند التشغيل (-e)، أو .env محلي غير مُصدَر، أو سر مُدار (أسرار Compose، ومتغيرات CI، والمنسّق). فسر مجمّد في ENV يبقى مقروءا في السجل ويرحل مع push.

ENV أم ملف إعداد مُركَّب؟

ENV للضبط البسيط (المنافذ، والأوضاع، والروابط) ؛ وملف مُركَّب للإعدادات الغنية (nginx.conf والشهادات). ويجتمع الاثنان : فأحدهما لا يستبعد الآخر.

تحقّق من فهمك

تغيّر منفذ الاستماع بين التطوير والإنتاج. ماذا تفعل؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 2أسئلة جديدة وأصعب للتحقق من مكتسباتك