init صغيرة ولكن صالحة للحاويات Tini هو أبسط init الذي يمكن أن تفكر فيه.
كل Tini يقوم بتفريغ طفل واحد (من المفترض أن يتم تشغيل Tini في حاوية) ، وانتظر حتى يخرج من كل ما يتجلب فيه أثناء جني الزومبي وإعادة توجيه الإشارة.
استخدام Tini له العديد من الفوائد:
SIGTERM بإنهاء عمليتك بشكل صحيح حتى لو لم تقم بتثبيت معالج إشارة بشكل صريح.إذا كنت ترغب في مزيد من التفاصيل حول سبب كون هذا مفيدًا ، راجع مناقشة المشكلة هذه: ما هي ميزة Tini؟.
ملاحظة: إذا كنت تستخدم Docker 1.13 أو أكثر ، يتم تضمين Tini في Docker نفسها. وهذا يشمل جميع إصدارات Docker CE. لتمكين Tini ، ما عليك سوى تمرير --init إلى docker run .
ملاحظة: هناك صور Docker مصممة مسبقًا متاحة لـ Tini. إذا كنت تستخدم حاليًا صورة Ubuntu أو CentOS كقاعدتك ، فيمكنك استخدام واحدة من تلك كبديل إسقاط.
ملاحظة: هناك حزم Tini لـ Alpine Linux و Nixos. انظر أدناه للحصول على تعليمات التثبيت.
أضف tini إلى الحاوية الخاصة بك ، وجعلها قابلة للتنفيذ. بعد ذلك ، فقط استدعاء Tini وتمرير برنامجك وحججه كحجال إلى Tini.
في Docker ، سترغب في استخدام نقطة دخول حتى لا تضطر إلى تذكر أن تستدعي Tini يدويًا:
# Add Tini
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]
# Run your program under Tini
CMD ["/your/program", "-and", "-its", "arguments"]
# or docker run your-image /your/program ...
لاحظ أنه يمكنك تخطي -- في ظل ظروف معينة ، ولكن قد تتضمنها دائمًا لتكون آمنة. إذا رأيت رسالة خطأ تبدو مثل tini: invalid option -- 'c' ، فأنت بحاجة إلى إضافة -- .
يجب تمرير وسيطات tini نفسها مثل -v في المثال التالي: /tini -v -- /your/program .
ملاحظة: الثنائي المرتبط أعلاه هو ثنائي 64 بت مرتبط ديناميكي.
يتم توقيع ثنائيات tini و tini-static باستخدام المفتاح 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 .
يمكنك التحقق من توقيعاتهم باستخدام gpg (والتي يمكنك تثبيتها باستخدام مدير الحزمة):
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini.asc /tini.asc
RUN gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7
&& gpg --batch --verify /tini.asc /tini
RUN chmod +x /tini
قامت ثنائيات tini و tini-static بإنشاء عمليات فحص ( SHA1 و SHA256 ).
يمكنك التحقق من عمليات الفحص الخاصة بهم باستخدام sha1sum و sha256sum (والتي يمكنك تثبيتها باستخدام مدير الحزمة الخاص بك):
ENV TINI_VERSION v0.19.0
RUN wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64
&& wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64.sha256sum
&& echo "$(cat tini-amd64.sha256sum)" | sha256sum -c
على Alpine Linux ، يمكنك استخدام الأمر التالي لتثبيت Tini:
RUN apk add --no-cache tini
# Tini is now available at /sbin/tini
ENTRYPOINT ["/sbin/tini", "--"]
باستخدام NIX ، يمكنك استخدام الأمر التالي لتثبيت Tini:
nix-env --install tini
على Debian (Buster أو أحدث) ، يمكنك استخدام الأمر التالي لتثبيت Tini:
apt-get install tini
لاحظ أن هذا يثبت /usr/bin/tini (و /usr/bin/tini-static ) ، وليس /tini .
على Arch Linux ، هناك حزمة متوفرة على AUR. التثبيت باستخدام التعليمات الرسمية أو استخدم Aur Helper:
pacaur -S tini
الذراع والثنائيات 32 بت متاحة! يمكنك العثور على القائمة الكاملة للثنائيات المتاحة ضمن علامة التبويب REASER.
يمكن استخدام الوسيطة -v لإخراج الإضافات الإضافية (يمكنك تمريرها إلى 3 مرات ، على سبيل المثال -vvv ).
بشكل افتراضي ، يحتاج Tini إلى تشغيل PID 1 حتى يتمكن من جني الزومبي (عن طريق الركض كـ PID 1 ، يتم إعادة عرض الزومبي إلى tini).
إذا كان لا يمكنك تشغيل Tini لسبب ما ، فيجب عليك تسجيل Tini كعملية فرعية بدلاً من ذلك (فقط في Linux> = 3.4) ، إما:
-s إلى tini ( tini -s -- ... )TINI_SUBREAPER (على سبيل المثال export TINI_SUBREAPER= ).سيضمن ذلك إعادة تايني إلى Tini على الرغم من عدم تشغيل Tini مثل PID 1.
ملاحظة: ستصدر Tini تحذيرًا إذا اكتشف أنه لا يعمل على أنه PID 1 ولا يتم تسجيله كقوة فرعية. إذا كنت لا ترى تحذيرًا ، فأنت بخير.
سيعيد Tini إعادة استخدام رمز خروج الطفل عند الخروج ، ولكن في بعض الأحيان ، قد لا يكون هذا بالضبط ما تريده (على سبيل المثال ، إذا كان طفلك يخرج بـ 143 بعد تلقي Sigterm). والجدير بالذكر أن هذه يمكن أن تكون مشكلة في تطبيقات Java.
في هذه الحالة ، يمكنك استخدام علامة -e لإعادة رسم رمز الخروج التعسفي إلى 0. يمكنك تمرير العلامة عدة مرات إذا لزم الأمر.
على سبيل المثال:
tini -e 143 -- ...
بشكل افتراضي ، يقتل Tini عملية الأطفال المباشرة فقط. قد يكون هذا غير مريح إذا لم يكن لإرسال إشارة إلى هذه العملية التأثير المطلوب. على سبيل المثال ، إذا قمت بذلك
docker run krallin/ubuntu-tini sh -c 'sleep 10'
و Ctrl-C ، لا يحدث شيء: يتم إرسال Sigint إلى عملية "SH" ، لكن هذه القشرة لن تتفاعل معها أثناء انتظار "النوم".
مع خيار -g ، يقتل Tini مجموعة عملية الطفل ، بحيث تحصل كل عملية في المجموعة على الإشارة. هذا يتوافق بشكل أوثق مع ما يحدث عند القيام بـ Ctrl-C وما إلى ذلك في محطة: يتم إرسال الإشارة إلى مجموعة عملية المقدمة.
يمكن لـ Tini ضبط إشارة الوفاة الأم ، وهي الإشارة التي يجب أن تتلقاها Tini عندما يخرج الوالد . لتعيين إشارة الوفاة الأصل ، استخدم علامة -p باسم الإشارة التي يجب أن تتلقىها Tini عندما يخرج الوالد:
tini -p SIGTERM -- ...
ملاحظة: راجع مناقشة العلاقات العامة هذه لمعرفة المزيد عن إشارة وفاة الوالدين واستخدامها.
يمكن أيضًا استخدام Tini مع نقطة دخول موجودة في الحاوية الخاصة بك!
على افتراض أن نقطة الدخول الخاصة بك كانت /docker-entrypoint.sh ، ثم يمكنك استخدامها:
ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"]
Tini لديه عدد قليل جدًا من التبعيات (يعتمد فقط على LIBC) ، ولكن إذا فشلت الحاوية الخاصة بك في البدء ، فقد ترغب في التفكير في استخدام الإصدار المبني بشكل ثابت بدلاً من ذلك:
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /tini
Tini هو ملف صغير جدًا (في نطاق 10 كيلو بايت) ، لذلك لا يضيف وزنًا كبيرًا إلى الحاوية الخاصة بك.
النسخة المرتبطة بشكل ثابت أكبر ، ولكن لا يزال <1M.
إذا كنت تفضل عدم تنزيل الثنائي ، فيمكنك إنشاء Tini عن طريق تشغيل cmake . && make .
قبل البناء ، ربما تريد أيضًا تشغيل:
export CFLAGS="-DPR_SET_CHILD_SUBREAPER=36 -DPR_GET_CHILD_SUBREAPER=37"
هذا يضمن أنه حتى لو كنت تبني على نظام يحتوي على رؤوس Kernel القديمة (<3.4) ، فسيتم بناء Tini بدعم من الأطفال. هذا هو عادة ما تريده إذا كنت ستستخدم Tini مع Docker (إذا كان kernel المضيف الخاص بك يدعم Docker ، فيجب أن يدعم أيضًا رؤساء الأطفال الفرعيين).
بعد تفريغ العملية ، ستنتظر Tini إشارات وإعادة توجيهها إلى عملية الطفل ، وتجني عمليات الزومبي بشكل دوري التي قد يتم إنشاؤها داخل الحاوية.
عندما تخرج عملية "First" ( /your/program في الأمثلة أعلاه) ، يخرج Tini أيضًا ، مع رمز الخروج لعملية الطفل (بحيث يمكنك التحقق من رمز خروج الحاوية الخاص بك لمعرفة ما إذا كان الطفل قد خرج بنجاح).
إذا كان هناك شيء لا يعمل تمامًا كما تتوقع ، ففكر في زيادة مستوى الفعل (حتى 3):
tini -v -- bash -c 'exit 1'
tini -vv -- true
tini -vvv -- pwd
المشرف:
المساهمين:
شكر خاص ل: