تحتوي صور "التوزيع" على تطبيقك فقط وتبعيات وقت التشغيل. لا تحتوي على مديري الحزم أو القذائف أو أي برامج أخرى تتوقع العثور عليها في توزيع Linux قياسي.
لمزيد من المعلومات ، شاهد هذا الحديث (الفيديو).
منذ مارس 2023 ، تستخدم الصور التوزيعية إظهار OCI ، إذا رأيت أخطاء تشير إلى application/vnd.oci.image.manifest.v1+json
أو application/vnd.oci.image.index.v1+json
، قم بتحديث أدوات الحاوية الخاصة بك (docker ، جيب ، إلخ) إلى الأحدث.
إن تقييد ما هو موجود في حاوية وقت التشغيل إلى ما هو ضروري لتطبيقك هو أفضل الممارسات التي تستخدمها Google وغيرها من عمالقة التكنولوجيا التي استخدمت الحاويات في الإنتاج لسنوات عديدة. إنه يحسن إشارة إلى ضوضاء الماسحات الضوئية (مثل CVE) ويقلل من عبء تأسيس الأصل على ما تحتاجه فقط.
الصور التوزيعية صغيرة جدا . أصغر صورة موزع ، gcr.io/distroless/static-debian12
، حوالي 2 mib. هذا هو حوالي 50 ٪ من حجم alpine
(~ 5 MIB) ، وأقل من 2 ٪ من حجم debian
(124 MIB).
تم تصميم هذه الصور باستخدام Bazel ، ولكن يمكن استخدامها أيضًا من خلال أدوات إنشاء صورة Docker الأخرى.
يتم نشر الصور التالية حاليًا وتحديثها بواسطة مشروع Distroless (انظر Support_Policy للحصول على الجداول الزمنية للدعم)
صورة | العلامات | اللواحق العمارة |
---|---|---|
gcr.io/distroless/static-debian12 | أحدث ، nonroot ، تصحيح ، تصحيح الأخطاء-nonroot | AMD64 ، ARM64 ، ARM ، S390X ، PPC64LE |
gcr.io/distroless/base-debian12 | أحدث ، nonroot ، تصحيح ، تصحيح الأخطاء-nonroot | AMD64 ، ARM64 ، ARM ، S390X ، PPC64LE |
gcr.io/distroless/base-nossl-debian12 | أحدث ، nonroot ، تصحيح ، تصحيح الأخطاء-nonroot | AMD64 ، ARM64 ، ARM ، S390X ، PPC64LE |
gcr.io/distroless/cc-debian12 | أحدث ، nonroot ، تصحيح ، تصحيح الأخطاء-nonroot | AMD64 ، ARM64 ، ARM ، S390X ، PPC64LE |
gcr.io/distroless/python3-debian12 | أحدث ، nonroot ، تصحيح ، تصحيح الأخطاء-nonroot | AMD64 ، ARM64 |
gcr.io/distroless/java-base-debian12 | أحدث ، nonroot ، تصحيح ، تصحيح الأخطاء-nonroot | AMD64 ، ARM64 ، S390X ، PPC64LE |
gcr.io/distroless/java17-debian12 | أحدث ، nonroot ، تصحيح ، تصحيح الأخطاء-nonroot | AMD64 ، ARM64 ، S390X ، PPC64LE |
gcr.io/distroless/java21-debian12 | أحدث ، nonroot ، تصحيح ، تصحيح الأخطاء-nonroot | AMD64 ، ARM64 ، PPC64LE |
gcr.io/distroless/nodejs18-debian12 | أحدث ، nonroot ، تصحيح ، تصحيح الأخطاء-nonroot | AMD64 ، ARM64 ، ARM ، S390X ، PPC64LE |
gcr.io/distroless/nodejs20-debian12 | أحدث ، nonroot ، تصحيح ، تصحيح الأخطاء-nonroot | AMD64 ، ARM64 ، ARM ، S390X ، PPC64LE |
gcr.io/distroless/nodejs22-debian12 | أحدث ، nonroot ، تصحيح ، تصحيح الأخطاء-nonroot | AMD64 ، ARM64 ، ARM ، S390X ، PPC64LE |
تشير هذه الصور إلى فهارس الصور مع إشارات إلى جميع البنى المدعومة. يمكن الرجوع مباشرة إلى صور محددة للهندسة المعمارية باستخدام لاحقة بنية إضافية على العلامة ، مثل gcr.io/distroless/static-debian12:latest-amd64
تعتبر أي علامات أخرى مستغلة ولم تعد محدثة
يتم توقيع جميع الصور الموزعة بواسطة COSIGN مع مفاتيح التأمين (بدون مفتاح) - هذه هي الآلية الوحيدة المدعومة التي تبدأ في نوفمبر 2023. نوصي بالتحقق من أي صورة توزيع تستخدمها قبل بناء صورتك. يمكنك التحقق من التوقيع بدون مفتاح لأي صورة توزيع مع:
cosign verify $IMAGE_NAME --certificate-oidc-issuer https://accounts.google.com --certificate-identity [email protected]
لاحظ أن الصور التوزيعية بشكل افتراضي لا تحتوي على قذيفة. هذا يعني أن الأمر DockerFile ENTRYPOINT
، عند تحديده ، يجب تحديده في نموذج vector
، لتجنب بادئة وقت تشغيل الحاويات مع قذيفة.
هذا يعمل:
ENTRYPOINT ["myapp"]
لكن هذا لا يعمل:
ENTRYPOINT "myapp"
لنفس الأسباب ، إذا تم تعيين نقطة الإدخال على المتجه الفارغ ، فيجب تحديد أمر CMD في نموذج vector
(انظر الأمثلة أدناه). لاحظ أنه افتراضيًا ، تحتوي الصور القاعدة و CC على نقطة إدخال المتجه الفارغة. الصور ذات وقت تشغيل اللغة المضمّن لديها افتراضي خاص باللغة (انظر: Java ، Nodejs ، Python3).
تقوم شركة Docker Multi-Stage Builds باستخدام صور التوزيع سهلة. اتبع هذه الخطوات للبدء:
اختر الصورة الأساسية الصحيحة لمكدس التطبيق الخاص بك.
اكتب ملف Docker متعدد المراحل. ملاحظة: يتطلب هذا Docker 17.05 أو أعلى.
الفكرة الأساسية هي أنه سيكون لديك مرحلة واحدة لإنشاء القطع الأثرية الخاصة بك ، وإدخالها في صورة التوزيع في وقت التشغيل الخاص بك. إذا كنت ترغب في معرفة المزيد ، فيرجى الاطلاع على الوثائق المتعلقة ببناء المراحل المتعددة.
إليك مثال سريع لـ GO:
# Start by building the application.
FROM golang:1.18 as build
WORKDIR /go/src/app
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 go build -o /go/bin/app
# Now copy it into our base image.
FROM gcr.io/distroless/static-debian12
COPY --from=build /go/bin/app /
CMD [ "/app" ]
يمكنك العثور على أمثلة أخرى هنا:
لتشغيل أي مثال ، انتقل إلى الدليل للغة والتشغيل
docker build -t myapp .
docker run -t myapp
لتشغيل Node.js Express App Node-Express وفضح منافذ الحاوية:
npm install # Install express and its transitive dependencies
docker build -t myexpressapp . # Normal build command
docker run -p 3000:3000 -t myexpressapp
يجب أن يعرض هذا التطبيق السريع على مضيفك المحلي: 3000
للحصول على وثائق كاملة حول كيفية استخدام Bazel لإنشاء صور الحاويات ، راجع مستودع Bazel-Contrib/Rules_oci.
للاطلاع على الوثائق والمثال على كيفية استخدام مدير حزمة Debian المستند إلى GO لإنشاء تكوين Bazel ، راجع. /package_manager
يمكن العثور على أمثلة في هذا المستودع في دليل الأمثلة.
لدينا بعض الأمثلة حول كيفية تشغيل بعض مداخل التطبيقات الشائعة في دليل /أمثلة. انظر هنا من أجل:
انظر هنا للحصول على أمثلة حول كيفية إكمال بعض المهام الشائعة في صورتك:
انظر هنا لمزيد من المعلومات حول كيفية بناء هذه الصور وإطلاقها.
تستند الصور التوزيعية إلى Debian 12 (Bookworm). يتم وضع علامة على الصور بشكل صريح مع لاحقة إصدار Debian (مثل -debian12
). سيقوم تحديد صورة بدون التوزيع حاليًا بتحديد صور -debian12
، ولكن ذلك سيتغير في المستقبل إلى إصدار أحدث من Debian. قد يكون من المفيد الإشارة إلى التوزيع بشكل صريح ، لمنع كسر البناء عند إصدار إصدار Debian التالي.
تعقب Distless إصدارات Debian في المنبع ، باستخدام إجراءات github لإنشاء طلب سحب تلقائيًا عند وجود تحديثات.
توزيعات الصور هي الحد الأدنى وتفتقر إلى القذيفة. يوفر صورة :debug
Cloy لكل لغة قذيفة Busybox للدخول.
على سبيل المثال:
cd examples/python3/
قم بتحرير Dockerfile
لتغيير الصورة النهائية إلى :debug
:
FROM gcr.io/distroless/python3-debian12:debug
COPY . /app
WORKDIR /app
CMD [ "hello.py" , "/etc" ]
ثم بناء وإطلاق مع نقطة دخول shell:
$ docker build -t my_debug_image .
$ docker run --entrypoint=sh -ti my_debug_image
/app # ls
BUILD Dockerfile hello.py
ملاحظة: إذا كانت الصورة التي تستخدمها لديها بالفعل علامة ، على سبيل المثال
gcr.io/distroless/java17-debian12:nonroot
، استخدم علامةdebug-<existing tag>
بدلاً من ذلك ، على سبيل المثالgcr.io/distroless/java17-debian12:debug-nonroot
.
ملاحظة: لم يتم تثبيت LDD في الصورة الأساسية لأنه نص Shell ، يمكنك نسخه أو تنزيله.
إذا كان مشروعك يستخدم التوزيع ، فأرسل علاقات عامة لإضافة مشروعك هنا!