Como usar o sistema de arquivos de rede CIFS/SMB

Nesta página, descrevemos como usar os sistemas de arquivos de rede CIFS/SMB com o Cloud Run.

Se você estiver usando NFS, Filestore ou Cloud Storage FUSE no Cloud Run, consulte as seguintes páginas:

Limitações

  • É preciso especificar o ambiente de execução de segunda geração ao usar smbnetfs.

  • Devido à restrição do ambiente de execução do Cloud Run, o CIFS/SMB não pode ser montado diretamente no Cloud Run. No entanto, é possível usar clientes SMB que não dependem da montagem do kernel, como smbnetfs (baseado em FUSE) ou smbclient.

  • O Cloud Run foi projetado para escalonar rapidamente para um grande número de instâncias. No entanto, a maioria dos sistemas de arquivos de rede não é projetada para uso simultâneo por um grande número de clientes. Para serviços do Cloud Run, use o recurso de instâncias máximas para limitar o número de instâncias do Cloud Run.

Como usar o smbnetfs

O smbnetfs é um sistema de arquivos baseado em FUSE que permite ativar compartilhamentos SMB como parte da hierarquia do sistema de arquivos local.

Para usar o smbnetfs com o Cloud Run, atualize o Dockerfile para instalar o smbnetfs e as dependências dele e configure as credenciais.

Configurar smbnetfs no Dockerfile

Adicione as seguintes instruções ao 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

Substitua <smb-server-ip>, <smb-username> e <smb-password> pelos detalhes de conexão do seu servidor SMB.

Ativar o compartilhamento SMB durante a inicialização do contêiner

Execute o smbnetfs para montar o compartilhamento quando o contêiner for iniciado e antes do aplicativo. Se o contêiner for executado como um usuário não raiz, talvez seja necessário ajustar as permissões ou a configuração do FUSE.

  1. Crie um ponto de montagem, como /mnt/smb, conforme mostrado no comando a seguir:

    mkdir /mnt/smb

  2. Monte o sistema de arquivos SMB usando o comando smbnetfs:

    smbnetfs /mnt/smb

  3. Acesse seu compartilhamento em /mnt/smb/<smb-server-ip>/<share-name>, conforme mostrado no comando a seguir:

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

Solução de problemas

Você pode encontrar erros de entrada/saída ao gravar em arquivos usando a flag O_APPEND com smbnetfs. Confira mais detalhes na discussão do Stack Overflow (em inglês).

Como usar o smbclient

smbclient é uma ferramenta de linha de comando que fornece uma interface semelhante ao FTP para acessar compartilhamentos SMB. Você pode usar esse recurso para transferir arquivos ou executar comandos em um servidor SMB.

  • Para evitar fornecer credenciais com cada comando, armazene-as em um arquivo.

    1. Armazene suas credenciais em um arquivo, por exemplo, smb-cred.txt:

      username = <smb-username>
      password = <smb-password>
      
    2. Como alternativa a um arquivo de credenciais, é possível fornecer credenciais com cada comando usando a opção -U ou --user. Por exemplo: --user=[DOMAIN\]USERNAME[%PASSWORD].

    3. Use a ferramenta smbclient com a flag -A para especificar o arquivo de credenciais. Por exemplo, para listar arquivos em um compartilhamento, execute o seguinte comando:

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

  • Para modificar arquivos com a ferramenta smbclient, baixe o arquivo, modifique-o localmente e faça upload de volta para o compartilhamento, conforme mostrado nas etapas a seguir.

    1. Faça o download de um arquivo executando o comando "get":

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

    2. Modifique o arquivo localmente.

    3. Faça upload do arquivo após a modificação executando o comando "put":

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

Quando você usa a ferramenta smbclient, o servidor SMB identifica você usando as credenciais fornecidas. Isso permite que o servidor aplique as permissões de arquivo corretas. Para uma lista completa de comandos smbclient, consulte a documentação oficial do smbclient.