Hub documentation
مساحات Docker
مساحات Docker
تستضيف Spaces حاويات Docker مخصصة للتطبيقات التي تقع خارج نطاق Streamlit وGradio. تتيح Spaces المعتمدة على Docker للمستخدمين تجاوز حدود ما كان ممكنًا سابقًا باستخدام SDKs القياسية. فمن نقاط نهاية FastAPI وGo إلى تطبيقات Phoenix وأدوات ML Ops، يمكن لـDocker Spaces أن تساعد في العديد من الإعدادات المختلفة.
إعداد مساحات Docker
اختيار Docker كـ SDK عند إنشاء مساحة جديدة سيهيّئ مساحتك من خلال تعيين خاصية sdk إلى docker في كتلة YAML الخاصة بملف README.md. أو، بالنسبة لمستودع مساحة موجود مسبقًا، عيّن sdk: docker داخل كتلة YAML في أعلى ملف README.md الخاص بمساحتك. يمكنك أيضًا تغيير المنفذ الافتراضي المكشوف 7860 عن طريق تعيين app_port: 7860. بعد ذلك، يمكنك إنشاء Dockerfile عادي.
---
title: Basic Docker SDK Space
emoji: 🐳
colorFrom: purple
colorTo: gray
sdk: docker
app_port: 7860
---يمكنك داخليًا فتح عدد غير محدود من المنافذ. على سبيل المثال، يمكنك تثبيت Elasticsearch داخل مساحتك (Space) واستدعائه داخليًا على المنفذ الافتراضي الخاص به 9200.
إذا كنت ترغب في إتاحة التطبيقات المُقدَّمة على عدة منافذ للعالم الخارجي، فإن حلاً بديلاً هو استخدام وكيل عكسي مثل Nginx لتوجيه الطلبات القادمة من الإنترنت الأوسع (على منفذ واحد) إلى منافذ داخلية مختلفة.
إدارة الأسرار والمتغيرات
يمكنك إدارة متغيرات البيئة الخاصة بمساحة في إعدادات المساحة. اقرأ المزيد هنا.
المتغيرات
وقت البناء
تُمرَّر المتغيرات كـbuild-args عند بناء مساحة Docker الخاصة بك. اقرأ التوثيق المخصص من Docker للحصول على دليل كامل حول كيفية استخدام ذلك في Dockerfile.
# Declare your environment variables with the ARG directive
ARG MODEL_REPO_NAME
FROM python:latest
# [...]
# You can use them like environment variables
RUN predict.py $MODEL_REPO_NAMEوقت التشغيل
تُحقن المتغيرات في بيئة الحاوية وقت التشغيل.
الأسرار
وقت البناء
في مساحات Docker، تختلف إدارة الأسرار لأسباب أمنية. بمجرد إنشاء سر في تبويب الإعدادات، يمكنك كشف السر عن طريق إضافة السطر التالي إلى ملف Dockerfile الخاص بك:
على سبيل المثال، إذا كان SECRET_EXAMPLE هو اسم السر الذي أنشأته في تبويب الإعدادات، يمكنك قراءته وقت البناء عن طريق تثبيته على ملف، ثم قراءته باستخدام $(cat /run/secrets/SECRET_EXAMPLE).
انظر إلى مثال أدناه:
# Expose the secret SECRET_EXAMPLE at buildtime and use its value as git remote URL
RUN --mount=type=secret,id=SECRET_EXAMPLE,mode=0444,required=true \
git init && \
git remote add origin $(cat /run/secrets/SECRET_EXAMPLE)# Expose the secret SECRET_EXAMPLE at buildtime and use its value as a Bearer token for a curl request
RUN --mount=type=secret,id=SECRET_EXAMPLE,mode=0444,required=true \
curl test -H 'Authorization: Bearer $(cat /run/secrets/SECRET_EXAMPLE)'وقت التشغيل
كما هو الحال مع المتغيرات العامة، يمكنك الوصول إلى الأسرار كمتغيرات بيئة وقت التشغيل. على سبيل المثال، في بايثون ستستخدم os.environ.get("SECRET_EXAMPLE"). اطّلع على هذا مثال لمساحة Docker تستخدم الأسرار.
الصلاحيات
يعمل الحاوية مع معرّف مستخدم 1000. لتجنب مشاكل الأذونات، يجب عليك إنشاء مستخدم وإعداد WORKDIR الخاص به قبل أي COPY أو تنزيل.
# Set up a new user named "user" with user ID 1000
RUN useradd -m -u 1000 user
# Switch to the "user" user
USER user
# Set home to the user's home directory
ENV HOME=/home/user \
PATH=/home/user/.local/bin:$PATH
# Set the working directory to the user's home directory
WORKDIR $HOME/app
# Try and run pip command after setting the user with `USER user` to avoid permission issues with Python
RUN pip install --no-cache-dir --upgrade pip
# Copy the current directory contents into the container at $HOME/app setting the owner to the user
COPY --chown=user . $HOME/app
# Download a checkpoint
RUN mkdir content
ADD --chown=user https://<SOME_ASSET_URL> content/<SOME_ASSET_NAME>Always specify the `--chown=user` with `ADD` and `COPY` to ensure the new files are owned by your user.
إذا كنت لا تزال تواجه مشاكل في الأذونات، فقد تحتاج إلى استخدام chmod أو chown في Dockerfile الخاص بك لمنح الأذونات الصحيحة. على سبيل المثال، إذا كنت تريد استخدام المجلد /data، يمكنك القيام بما يلي:
RUN mkdir -p /data
RUN chmod 777 /dataيجب عليك دائمًا تجنب تغييرات الملكية غير الضرورية.
إن تحديث بيانات الوصف (metadata) لملف يُنشئ نسخة جديدة تُخزَّن في الطبقة الجديدة. لذلك، قد يؤدي تنفيذ أمر chown بشكل تكراري (recursive) إلى إنشاء صورة ضخمة الحجم بسبب تكرار جميع الملفات المتأثرة.
بدلاً من إصلاح الصلاحية عبر تشغيل chown:
COPY checkpoint .
RUN chown -R user checkpointيجب عليك دائماً القيام بما يلي:
COPY --chown=user checkpoint .(يُطبق الأمر نفسه على أمر ADD)
استمرارية البيانات
تُفقد البيانات المكتوبة على القرص عند إعادة تشغيل مساحة Docker الخاصة بك. ولحفظ البيانات عبر عمليات إعادة التشغيل، يمكنك إرفاق Storage Bucket بمساحتك.
حاليًا، حجم
/dataمتاح فقط وقت التشغيل، أي أنك لا تستطيع استخدام/dataأثناء خطوة البناء في ملف Dockerfile الخاص بك.
يمكنك أيضًا استخدام مركز مجموعات البيانات لدينا للحالات المحددة، حيث يمكنك تخزين الحالة والبيانات في مستودع git LFS. يمكنك العثور على مثال للاستمرارية هنا، والذي يستخدم مكتبة huggingface_hub لرفع الملفات برمجياً إلى مستودع مجموعة بيانات. سيساعدك هذا المثال الخاص بـ Space معًا مع هذا الدليل في تحديد أي حل يناسب نوع بياناتك بشكل أفضل.
أخيرًا، في بعض الحالات، قد ترغب في استخدام حل تخزين خارجي من كود مساحة العمل الخاصة بك، مثل قاعدة بيانات مستضافة خارجيًا، أو S3، وما إلى ذلك.
حاوية Docker مع GPU
يمكنك تشغيل حاويات Docker مع دعم GPU باستخدام أحد أجهزة Spaces الخاصة بـ GPU.
نوصي باستخدام nvidia/cuda من Docker Hub كصورة أساسية، حيث تأتي مع CUDA وcuDNN مثبتة مسبقًا.
During Docker buildtime, you don't have access to a GPU hardware. Therefore, you should not try to run any GPU-related command during the build step of your Dockerfile. For example, you can't run `nvidia-smi` or `torch.cuda.is_available()` building an image. Read more [here](https://github.com/NVIDIA/nvidia-docker/wiki/nvidia-docker#description).