Docker化FastAPI应用时GCP服务账号JSON文件找不到问题排查
问题场景
将集成Firebase的FastAPI应用容器化时,已配置Dockerfile和docker-compose.yml,执行docker-compose up -d --build后容器启动失败,报错:
FileNotFoundError: [Errno 2] No such file or directory: '/env/service_account.json'
确认容器内环境变量GOOGLE_APPLICATION_CREDENTIALS=/env/service_account.json已正确设置。
核心原因
docker-compose.yml中配置的volumes: - ./env:/env会将宿主机的./env目录挂载到容器的/env目录,直接覆盖Dockerfile中通过COPY ./service_account.json /env复制到容器内的文件。如果宿主机本地的./env目录为空,或者没有放置service_account.json文件,容器内的/env目录就会变成空目录,导致找不到目标文件。
解决方法
方案一:移除不必要的目录挂载
如果不需要通过宿主机动态修改service_account.json,直接删除docker-compose.yml中的相关挂载配置:
# 删除以下内容 volumes: - ./env:/env # 同时删除文件末尾的 volumes: env:
这样Dockerfile中复制的service_account.json会保留在容器的/env目录中,应用即可正常读取。
方案二:确保宿主机挂载目录存在目标文件
如果需要通过宿主机挂载来管理凭证文件,先在宿主机的./env目录下放入service_account.json文件,再执行容器启动命令。容器启动后,挂载的目录会包含该文件,应用就能正常访问。
方案三:调整挂载路径避免覆盖
修改docker-compose.yml的挂载路径,不覆盖Dockerfile中创建的/env目录,同时调整环境变量指向新路径:
比如挂载到/env-external:
environment: - GOOGLE_APPLICATION_CREDENTIALS=/env-external/service_account.json volumes: - ./env:/env-external
同时将宿主机./env目录下的service_account.json放置好,这样既保留容器内原有目录,又能通过挂载获取外部凭证文件。
内容的提问来源于stack exchange,提问作者Muteshi

