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

בדף הזה מוסבר איך להשתמש במערכות קבצים ברשת CIFS/SMB עם Cloud Run.

אם אתם משתמשים ב-NFS, ב-Filestore או ב-Cloud Storage FUSE ב-Cloud Run, כדאי לעיין בדפים הבאים:

מגבלות

  • כשמשתמשים ב-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, צריך לעדכן את קובץ ה-Docker כדי להתקין את smbnetfs ואת התלות שלו, ולהגדיר פרטי כניסה.

הגדרה של smbnetfs בקובץ Dockerfile

מוסיפים את ההוראות הבאות לקובץ 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.