Como usar o sistema de arquivos de rede CIFS/SMB

O Cloud Run permite conectar instâncias de contêiner a compartilhamentos de arquivos por rede CIFS e SMB para que você possa ler e gravar arquivos compartilhados. É possível montar compartilhamentos no espaço do usuário, em vez do espaço do kernel, usando smbnetfs ou transferir arquivos usando smbclient.

Para outras opções de armazenamento no Cloud Run, consulte como configurar volumes NFS ou do Filestore para serviços, jobs, pools de workers ou instâncias. Também é possível configurar volumes do Cloud Storage FUSE para serviços, jobs, pools de workers ou instâncias.

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

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 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 ser iniciado. 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 o 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

Talvez você encontre 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.

Como usar o smbclient

smbclient é uma ferramenta de linha de comando que fornece uma interface semelhante a FTP para acessar compartilhamentos SMB. Você pode usá-lo para transferir arquivos ou executar comandos em um servidor SMB.

  • Para evitar o fornecimento de credenciais em cada comando, é possível armazená-las 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, faça o download do arquivo, modifique-o localmente e faça o upload dele 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 do arquivo corretas. Para uma lista completa de comandos smbclient, consulte a documentação oficial do smbclient.