本地Docker运行Colab本地Runtime时,挂载Google Drive报错KeyError: 'TBE_EPHEM_CREDS_ADDR'
我太懂你这种憋屈感了——本来是为了避开Colab订阅的算力瓶颈,折腾半天把本地Docker版的Colab Runtime弄起来,结果卡在挂载Google Drive这一步,确实闹心。
先给你说清楚这个错误的根源:TBE_EPHEM_CREDS_ADDR是Colab云端环境里用来处理Google Drive授权凭证的专属环境变量,而你用的官方Colab Docker镜像并没有配置这个变量(毕竟它只是复刻了算力环境,没完整照搬Colab的云端服务组件),所以drive.mount()一调用就找不到这个变量,直接抛出KeyError。
下面给你几个实用的解决方案,按推荐程度排序:
方案一:直接挂载本地同步的GDrive文件夹(最省心)
既然你已经装了Windows版的GDrive客户端,本地已经同步了云端的文件,那完全可以跳过drive.mount(),把本地同步的GDrive目录直接挂载到Docker容器里:
修改你启动Docker的命令,加上-v参数映射本地文件夹:
docker run --gpus=all -p 127.0.0.1:9000:8080 -v "C:\Users\你的用户名\Google Drive:/content/drive" us-docker.pkg.dev/colab-images/public/runtime
(记得把C:\Users\你的用户名\Google Drive换成你实际的GDrive同步路径)
这样启动容器后,在Colab里直接访问/content/drive就能看到你本地同步的所有GDrive文件,完全不用再执行挂载命令,简单粗暴解决问题。
方案二:手动补全环境变量+用服务账号授权(适合需要直接访问云端GDrive)
如果你必须直接操作云端的GDrive文件(比如本地同步的文件不全),可以手动设置环境变量,再用Google服务账号来授权:
- 先去Google Cloud Console创建一个服务账号,下载JSON格式的密钥文件;
- 把密钥文件放到本地某个文件夹,然后用
-v参数把这个文件夹挂载到Docker容器里; - 在Colab里执行以下代码:
import os # 随便填个值就行,主要是避免KeyError os.environ['TBE_EPHEM_CREDS_ADDR'] = 'localhost:8080' # 用服务账号密钥授权 from google.oauth2 import service_account from googleapiclient.discovery import build # 替换成你挂载到容器里的密钥文件路径 credentials = service_account.Credentials.from_service_account_file('/content/your-service-key.json', scopes=['https://www.googleapis.com/auth/drive']) drive_service = build('drive', 'v3', credentials=credentials)
之后你就可以通过drive_service来调用GDrive的API操作文件了,注意要给这个服务账号授权你需要访问的GDrive文件/文件夹(在GDrive里右键文件→共享→添加服务账号的邮箱)。
方案三:放弃Docker,直接用本地Jupyter做Colab运行时(兼容性最好)
其实Colab的本地运行时不一定非要用Docker,如果你本地Windows已经装好了Python、CUDA和必要的库,直接用本地Jupyter服务器连接Colab会更省心:
- 本地安装依赖:
pip install jupyter jupyter_http_over_ws
- 启用扩展:
jupyter serverextension enable --py jupyter_http_over_ws
- 启动Jupyter服务器:
jupyter notebook --NotebookApp.allow_origin='https://colab.research.google.com' --port=9000 --NotebookApp.port_retries=0
- 然后在Colab里选择“连接到本地运行时”,输入对应的URL,这样
drive.mount()就能正常工作了,因为本地Jupyter环境和Colab的凭证系统兼容性更好。
额外提醒
你之前装的Windows版GDrive客户端和Colab的drive.mount()完全是两回事——前者是本地同步工具,后者是直接连接云端的API调用,依赖Colab云端的服务组件,所以装了客户端也解决不了这个KeyError问题哦。
备注:内容来源于stack exchange,提问作者Keram Dzhasheev




