このページでは、Cloud Run で CIFS/SMB ネットワーク ファイル システムを使用する方法について説明します。
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 構成の調整が必要になることがあります。
次のコマンドに示すように、
/mnt/smbなどのマウント ポイントを作成します。mkdir /mnt/smbsmbnetfsコマンドを使用して SMB ファイル システムをマウントします。smbnetfs /mnt/smb次のコマンドに示すように、
/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 サーバーでファイルを転送したり、コマンドを実行したりできます。
コマンドごとに認証情報を指定しなくても済むように、認証情報をファイルに保存できます。
認証情報をファイル(
smb-cred.txtなど)に保存します。username = <smb-username> password = <smb-password>認証情報ファイルの代わりに、
-Uオプションまたは--userオプションを使用して、各コマンドで認証情報を指定することもできます(例:--user=[DOMAIN\]USERNAME[%PASSWORD])。smbclientツールで-Aフラグを使用して、認証情報ファイルを指定します。たとえば、共有内のファイルの一覧を取得するには、次のコマンドを実行します。smbclient //smb-server-ip/share-name -A smb-cred.txt -c 'ls'
smbclient ツールでファイルを変更するには、次の手順でファイルを取得し、ローカルで変更してから、共有にアップロードします。
get コマンドを実行してファイルをダウンロードします。
smbclient //smb-server-ip/share-name -A smb-cred.txt -c 'get remote local'
ファイルをローカルで変更します。
変更後、put コマンドを実行してファイルをアップロードします。
smbclient //smb-server-ip/share-name -A smb-cred.txt -c 'put local remote'
smbclient ツールを使用すると、SMB サーバーは提供された認証情報を使用してユーザーを識別します。これにより、サーバーは適切なファイル権限を適用できます。smbclient コマンドの一覧については、smbclient の公式ドキュメントをご覧ください。