Utilizzo del file system di rete CIFS/SMB

Cloud Run ti consente di connettere le istanze di container alle condivisioni file di rete CIFS e SMB in modo da poter leggere e scrivere file condivisi. Puoi montare le condivisioni nello spazio utente, anziché nello spazio kernel, utilizzando smbnetfs o trasferire i file utilizzando smbclient.

Per altre opzioni di archiviazione su Cloud Run, scopri come configurare i volumi NFS o Filestore per servizi, job, pool di worker o istanze. Puoi anche configurare i volumi Cloud Storage FUSE per servizi, job, pool di worker o istanze.

Limitazioni

  • Devi specificare l'ambiente di esecuzione di seconda generazione quando utilizzi smbnetfs.

  • A causa della limitazione dell'ambiente di esecuzione di Cloud Run, non è possibile montare direttamente CIFS/SMB all'interno di Cloud Run. Tuttavia, puoi utilizzare client SMB che non si basano sul montaggio del kernel, come smbnetfs (basato su FUSE) o smbclient.

  • Cloud Run è progettato per scalare rapidamente fino a un numero elevato di istanze. Tuttavia, la maggior parte dei file system di rete non è progettata per l'utilizzo simultaneo da parte di un numero elevato di client. Per i servizi Cloud Run, valuta la possibilità di utilizzare la funzionalità Numero massimo di istanze per limitare il numero di istanze Cloud Run.

Uso: smbnetfs

smbnetfs è un file system basato su FUSE che consente di montare le condivisioni SMB come parte della gerarchia del file system locale.

Per utilizzare smbnetfs con Cloud Run, aggiorna il Dockerfile per installare smbnetfs e le relative dipendenze e configura le credenziali.

Configura smbnetfs nel Dockerfile

Aggiungi le seguenti istruzioni al Dockerfile:

# 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

Sostituisci <smb-server-ip>, <smb-username> e <smb-password> con i dettagli di connessione del tuo server SMB.

Monta la condivisione SMB durante l'avvio del container

Esegui smbnetfs per montare la condivisione all'avvio del container e prima dell'avvio dell'applicazione. Se il container viene eseguito come utente non root, potrebbe essere necessario modificare le autorizzazioni o la configurazione di FUSE.

  1. Crea un punto di montaggio come /mnt/smb, come mostrato nel comando seguente:

    mkdir /mnt/smb

  2. Monta il file system SMB utilizzando il comando smbnetfs:

    smbnetfs /mnt/smb

  3. Accedi alla condivisione in /mnt/smb/<smb-server-ip>/<share-name>, come mostrato nel comando seguente:

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

Risoluzione dei problemi

Potresti riscontrare errori di input/output durante la scrittura di file utilizzando il flag O_APPEND con smbnetfs. Scopri di più nella discussione su Stack Overflow.

Utilizzo di smbclient

smbclient è uno strumento a riga di comando che fornisce un'interfaccia simile a FTP per accedere alle condivisioni SMB. Puoi utilizzarlo per trasferire file o eseguire comandi su un server SMB.

  • Per evitare di fornire le credenziali con ogni comando, puoi memorizzarle in un file.

    1. Archivia le tue credenziali in un file, ad esempio smb-cred.txt:

      username = <smb-username>
      password = <smb-password>
      
    2. In alternativa a un file di credenziali, puoi fornire le credenziali con ogni comando utilizzando l'opzione -U o --user, ad esempio: --user=[DOMAIN\]USERNAME[%PASSWORD].

    3. Utilizza lo strumento smbclient con il flag -A per specificare il file delle credenziali. Ad esempio, per elencare i file in una condivisione, esegui questo comando:

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

  • Per modificare i file con lo strumento smbclient, scarica il file, modificalo localmente e poi caricalo di nuovo nella condivisione come mostrato nei passaggi seguenti.

    1. Scarica un file eseguendo il comando get:

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

    2. Modifica il file localmente.

    3. Carica il file dopo la modifica eseguendo il comando put:

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

Quando utilizzi lo strumento smbclient, il server SMB ti identifica utilizzando le credenziali che fornisci. In questo modo, il server può applicare le autorizzazioni dei file corrette. Per un elenco completo dei comandi smbclient, consulta la documentazione ufficiale di smbclient.