本页面介绍了如何将 CIFS/SMB 网络文件系统与 Cloud Run 搭配使用。
如果您在 Cloud Run 上使用 NFS、Filestore 或 Cloud Storage FUSE,请参阅以下页面:
限制
使用
smbnetfs时,您必须指定第二代执行环境。由于 Cloud Run 执行环境存在限制,因此无法直接在 Cloud Run 中装载 CIFS/SMB。不过,您可以使用不依赖于内核装载的 SMB 客户端,例如
smbnetfs(基于 FUSE)或smbclient。Cloud Run 旨在快速扩容到大量实例。但是,大多数网络文件系统并非设计为供大量客户端并发使用。对于 Cloud Run 服务,请考虑使用实例数上限功能来限制 Cloud Run 实例的数量。
使用 smbnetfs
smbnetfs 是一种基于 FUSE 的文件系统,可让您将 SMB 共享作为本地文件系统层次结构的一部分进行装载。
如需将 smbnetfs 与 Cloud Run 搭配使用,请更新您的 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 以在容器启动时以及应用启动之前装载共享。如果您的容器以非根用户身份运行,您可能需要调整权限或 FUSE 配置。
创建装载点(例如
/mnt/smb),如以下命令所示:mkdir /mnt/smb使用
smbnetfs命令装载 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 是一种命令行工具,可提供类似于 FTP 的界面来访问 SMB 共享。您可以使用它在 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 官方文档。