Utilizzo del file system di rete CIFS/SMB

Questa pagina descrive l'utilizzo dei file system di rete CIFS/SMB con Cloud Run.

Se utilizzi NFS, Filestore o Cloud Storage FUSE su Cloud Run, consulta le seguenti pagine:

Limitazioni

  • Quando utilizzi smbnetfs, devi specificare l'ambiente di esecuzione di seconda generazione.

  • A causa della limitazione dell'ambiente di esecuzione di Cloud Run, CIFS/SMB non può essere montato direttamente 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 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à istanze massime 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 in 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 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 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 nei file utilizzando il flag O_APPEND con smbnetfs. Per maggiori dettagli, consulta la 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 credenziali in un file, ad esempio smb-cred.txt:

      username = <smb-username>
      password = <smb-password>
      
    2. In alternativa a un file delle 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 corrette per i file. Per un elenco completo dei comandi smbclient, consulta la documentazione ufficiale di smbclient.