使用Python脚本从Azure容器下载Blob CSV文件失败:只读文件系统错误
解决Azure Functions中下载Blob到本地目录的只读文件系统错误
问题原因
Azure Functions的/home/site/wwwroot目录是部署代码的位置,默认是只读的,即使设置FUNCTION_APP_EDIT_MODE=readwrite也只是允许在线编辑函数代码,并非开放整个目录的写入权限。你之前尝试写入这个目录才会触发Errno 30错误。
可行解决方案
1. 直接使用临时目录/tmp存储下载的文件
/tmp是Azure Functions中唯一支持写入的临时目录,所有文件操作都应该在这里进行。修改你的代码如下:
import datetime import logging from azure.storage.blob import BlobServiceClient import azure.functions as func import os def main(mytimer: func.TimerRequest) -> None: utc_timestamp = datetime.datetime.utcnow().replace( tzinfo=datetime.timezone.utc).isoformat() if mytimer.past_due: logging.info('The timer is past due!') logging.info('Python timer trigger function ran at %s', utc_timestamp) # Azure Blob Storage credentials account_name = '' account_key = '' container_name = '' connection_string = f"" # 填入你的Blob存储连接字符串 # Connect to Blob Storage blob_service_client = BlobServiceClient.from_connection_string(connection_string) blob_client = blob_service_client.get_blob_client(container=container_name, blob="blob.csv") # 使用/tmp目录作为存储路径 filepath = "/tmp" # 确保文件名与Blob名称一致,避免混淆 full_path = os.path.join(filepath, "blob.csv") with open(file=full_path, mode="wb") as sample_blob: download_stream = blob_client.download_blob() sample_blob.write(download_stream.readall()) # 在这里添加后续的文件处理逻辑(比如读取CSV、数据处理等) logging.info(f"文件已成功下载到临时目录: {full_path}")
2. 后续文件操作的注意事项
/tmp目录的文件会在函数实例被回收时被清空,所以如果需要持久化处理后的文件,不要尝试复制到/home目录(本身只读),而是直接将处理后的文件上传回Azure Blob存储或者其他持久化存储服务(比如Azure SQL、Cosmos DB等)。- 如果需要长期保存文件,建议处理完成后立即上传到Blob存储,避免实例回收导致文件丢失。
为什么之前的尝试无效?
FUNCTION_APP_EDIT_MODE=readwrite仅用于允许在Azure门户中编辑函数代码,不能改变/home/site/wwwroot目录的只读属性。- 无法从
/tmp复制到/home是因为/home本身就是只读的,这个限制是Azure Functions运行环境的固有设定,无法绕过。
内容的提问来源于stack exchange,提问作者Zixer
相关产品推荐
相关产品推荐

