CIFS/SMB ネットワーク ファイル システムの使用

Cloud Run を使用すると、コンテナ インスタンスを CIFS および SMB ネットワーク ファイル共有に接続して、共有ファイルの読み取りと書き込みを行うことができます。smbnetfs を使用して、カーネル空間ではなくユーザー空間に共有をマウントできます。また、smbclient を使用してファイルを転送することもできます。

Cloud Run の他のストレージ オプションについては、サービス、ジョブ、ワーカープール、インスタンスの NFS ボリュームまたは Filestore ボリュームを構成する方法をご覧ください。サービス、ジョブ、ワーカープール、インスタンスに Cloud Storage FUSE ボリュームを構成することもできます。

制限事項

  • smbnetfs を使用する場合は、第 2 世代の実行環境を指定する必要があります。

  • Cloud Run 実行環境の制限により、CIFS / SMB を Cloud Run 内に直接マウントすることはできません。ただし、smbnetfs(FUSE ベース)や smbclient など、カーネル マウントに依存しない SMB クライアントを使用できます。

  • Cloud Run は、多数のインスタンスに迅速にスケーリングできるように設計されています。ただし、ほとんどのネットワーク ファイル システムは、多数のクライアントが同時に使用するようには設計されていません。Cloud Run サービスの場合は、最大インスタンス機能を使用して、Cloud Run インスタンスの数を制限することを検討してください。

smbnetfs の使用

smbnetfs は、SMB 共有をローカル ファイル システム階層の一部としてマウントできる FUSE ベースのファイル システムです。

Cloud Run で smbnetfs を使用するには、Dockerfile を更新して smbnetfs とその依存関係をインストールし、認証情報を構成します。

Dockerfile で smbnetfs を構成する

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

<smb-server-ip>、<smb-username>、<smb-password> は、SMB サーバーの接続の詳細に置き換えます。

コンテナの起動時に SMB 共有をマウントする

コンテナの起動時、アプリケーションの起動前に、smbnetfs を実行して共有をマウントします。コンテナが root 以外のユーザーとして実行される場合は、権限または FUSE 構成の調整が必要になることがあります。

  1. 次のコマンドに示すように、/mnt/smb などのマウント ポイントを作成します。

    mkdir /mnt/smb

  2. smbnetfs コマンドを使用して SMB ファイル システムをマウントします。

    smbnetfs /mnt/smb

  3. 次のコマンドに示すように、/mnt/smb/<smb-server-ip>/<share-name> で共有にアクセスします。

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

トラブルシューティング

smbnetfs で O_APPEND フラグを使用してファイルに書き込むときに、入出力エラーが発生することがあります。詳しくは、Stack Overflow のディスカッションをご覧ください。

smbclient を使用する

smbclient は、SMB 共有にアクセスするための FTP のようなインターフェースを提供するコマンドライン ツールです。これを使用して、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 ドキュメントをご覧ください。