שימוש במערכת קבצים ברשת CIFS/SMB

ב-Cloud Run אתם יכולים לחבר מכונות של קונטיינרים להתקנים לשיתוף קבצים ברשת CIFS ו-SMB, כדי לקרוא ולכתוב קבצים משותפים. אפשר לטעון את השיתופים במרחב המשתמש, במקום במרחב הליבה, באמצעות smbnetfs או להעביר קבצים באמצעות smbclient.

כדי להשתמש באפשרויות אחסון אחרות ב-Cloud Run, אתם יכולים לקרוא איך מגדירים אמצעי אחסון של NFS או Filestore לשירותים, למשימות, למאגרי Worker או למכונות. אפשר גם להגדיר את אמצעי האחסון של Cloud Storage FUSE לשירותים, למשימות, למאגרי Worker או למכונות.

מגבלות

  • כשמשתמשים ב-smbnetfs, צריך לציין את סביבת ההפעלה מהדור השני.

  • בגלל ההגבלה של סביבת ההפעלה של Cloud Run, אי אפשר לטעון את CIFS/SMB ישירות בתוך Cloud Run. עם זאת, אתם יכולים להשתמש בלקוחות SMB שלא מסתמכים על טעינת ליבה, כמו smbnetfs (מבוסס-FUSE) או smbclient.

  • ‫Cloud Run נועד להתאים את עצמו במהירות למספר גדול של מכונות. עם זאת, רוב מערכות קובצי הרשת לא מיועדות לשימוש בו-זמני על ידי מספר גדול של לקוחות. בשירותי Cloud Run, כדאי להשתמש במאפיין maximum instances כדי להגביל את מספר המכונות של Cloud Run.

שימוש ב-smbnetfs

‫smbnetfs היא מערכת קבצים שמבוססת על FUSE ומאפשרת לטעון שיתופי SMB כחלק מההיררכיה של מערכת הקבצים המקומית.

כדי להשתמש ב-smbnetfs עם Cloud Run, צריך לעדכן את קובץ ה-Dockerfile כדי להתקין את smbnetfs ואת יחסי התלות שלו, ולהגדיר את פרטי הכניסה.

הגדרת smbnetfs בקובץ Docker

מוסיפים את ההוראות הבאות לקובץ ה-Docker:

# Install smbnetfs, fuse and other dependencies
RUN apt-get update && apt-get install -y smbnetfs fuse && rm -rf /var/lib/apt/lists/*

# Setup smbnetfs configuration
RUN mkdir -p ~/.smb
# Check if files exist before copying, as strict locations might vary or be missing in minimal images
RUN [ -f /etc/smbnetfs.conf ] && cp /etc/smbnetfs.conf ~/.smb/ || echo "smbnetfs.conf not found"

# Create the auth file
# In production, use mechanisms like [Secret Manager](/run/docs/configuring/services/secrets) to handle credentials
# securely instead of placing them directly in the Dockerfile.
RUN echo 'auth "<smb-server-ip>" "<smb-username>" "<smb-password>"' > ~/.smb/smbnetfs.auth
RUN chmod 600 ~/.smb/smbnetfs.auth

# Create the host file
RUN echo 'host <smb-server-ip> visible=true' > ~/.smb/smbnetfs.host
RUN chmod 600 ~/.smb/smbnetfs.host

# Enable the includes in the main config if they exist
RUN if [ -f ~/.smb/smbnetfs.conf ]; then \
    sed -i 's/^#include "smbnetfs.auth"/include "smbnetfs.auth"/' ~/.smb/smbnetfs.conf && \
    sed -i 's/^#include "smbnetfs.host"/include "smbnetfs.host"/' ~/.smb/smbnetfs.conf; \
    fi

מחליפים את <smb-server-ip>,‏ <smb-username> ו-<smb-password> בפרטי החיבור לשרת ה-SMB.

טעינת שיתוף ה-SMB במהלך הפעלת הקונטיינר

מריצים את smbnetfs כדי לטעון את השיתוף כשהקונטיינר מתחיל ולפני שהאפליקציה מתחילה. אם הקונטיינר פועל כמשתמש Root, יכול להיות שתצטרכו לשנות את ההרשאות או את ההגדרות של FUSE.

  1. יוצרים נקודת טעינה כמו /mnt/smb, כפי שמוצג בפקודה הבאה:

    mkdir /mnt/smb

  2. טוענים את מערכת הקבצים של ה-SMB באמצעות הפקודה smbnetfs:

    smbnetfs /mnt/smb

  3. ניגשים לתיקייה המשותפת ב-/mnt/smb/<smb-server-ip>/<share-name>, כמו שמוצג בפקודה הבאה:

    ls /mnt/smb/smb-server-ip/share-name

פתרון בעיות

יכול להיות שתיתקלו בשגיאות קלט/פלט כשאתם כותבים לקבצים באמצעות הדגל O_APPEND עם smbnetfs. פרטים נוספים זמינים בדיון ב-Stack Overflow.

שימוש ב-smbclient

‫smbclient הוא כלי שורת פקודה שמספק ממשק דמוי FTP לגישה לשיתופי SMB. אתם יכולים להשתמש בו כדי להעביר קבצים או להריץ פקודות בשרת SMB.

  • כדי להימנע מהזנת פרטי כניסה בכל פקודה, אתם יכולים לשמור אותם בקובץ.

    1. שומרים את פרטי הכניסה בקובץ, למשל smb-cred.txt:

      username = <smb-username>
      password = <smb-password>
      
    2. במקום קובץ פרטי כניסה, אפשר לספק פרטי כניסה עם כל פקודה באמצעות האפשרות -U או --user, לדוגמה: --user=[DOMAIN\]USERNAME[%PASSWORD].

    3. משתמשים בכלי smbclient עם הדגל -A כדי לציין את קובץ פרטי הכניסה. לדוגמה, כדי להציג רשימה של קבצים בתיקייה משותפת, מריצים את הפקודה הבאה:

      smbclient //smb-server-ip/share-name -A smb-cred.txt -c 'ls'

  • כדי לשנות קבצים באמצעות הכלי smbclient, מורידים את הקובץ, משנים אותו באופן מקומי ואז מעלים אותו בחזרה לשיתוף, כמו שמוסבר בשלבים הבאים.

    1. מורידים קובץ באמצעות הפקודה get:

      smbclient //smb-server-ip/share-name -A smb-cred.txt -c 'get remote local'

    2. משנים את הקובץ באופן מקומי.

    3. מעלים את הקובץ אחרי השינוי על ידי הפעלת הפקודה put:

      smbclient //smb-server-ip/share-name -A smb-cred.txt -c 'put local remote'

כשמשתמשים בכלי smbclient, שרת ה-SMB מזהה אתכם באמצעות פרטי הכניסה שאתם מספקים. כך השרת יכול להחיל את ההרשאות הנכונות לקבצים. רשימה מלאה של פקודות smbclient מופיעה במסמכי התיעוד הרשמיים של smbclient.