Google Cloud Run 不加载 .env 文件

如何解决Google Cloud Run 不加载 .env 文件

过去几天我一直在试图找出我做错了什么,但我仍然无法弄清楚,因为我能够使用 flask run 在本地运行应用程序,还可以使用 {{1} 使用 Docker }}。 Source code is here

我的问题是我的 Cloud Run 部署成功,但当我点击 URL 时服务不可用。我检查了日志,似乎我的环境变量没有正确加载:

docker-compose up --build

我有一个 line 7,in <module> from web_messaging.blueprints.user import user File "/web_messaging/web_messaging/blueprints/user/__init__.py",line 1,in <module> from web_messaging.blueprints.user.views import user File "/web_messaging/web_messaging/blueprints/user/views.py",line 3,in <module> from web_messaging.extensions import mongo,login_manager,c,bc File "/web_messaging/web_messaging/extensions.py",line 18,in <module> twilio_client = Client(TWILIO_SID,TWILIO_TOKEN) File "/usr/local/lib/python3.9/site-packages/twilio/rest/__init__.py",line 54,in __init__ raise TwilioException("Credentials are required to create a TwilioClient") twilio.base.exceptions.TwilioException: Credentials are required to create a TwilioClient 文件一个 config/.env。我正在使用 config/settings.py 上的 .envload_dotenv() 加载环境变量。我决定在我的 config/settings.py添加一些 print 和 try/expect 语句来查看变量的值。

settings.py

config/settings.py

当我使用 Flask run、docker-compose 或 cloud-run 运行时:

  • import os from dotenv import load_dotenv BASEDIR = os.path.abspath(os.path.dirname(__file__)) try: load_dotenv(os.path.join(BASEDIR,'.env')) print("OK") print(BASEDIR) except Exception as e: print(str(e)) # Mongo Database MONGO_URI = os.getenv('MONGO_URI') TWILIO_SID = os.getenv('TWILIO_SID') TWILIO_TOKEN = os.getenv('TWILIO_TOKEN') print(MONGO_URI) print(TWILIO_SID) 值为 BASEDIR
  • /web_messaging/config 调用期间没有异常

但是,有一个主要区别,它是我的 env 变量的值,例如 load_dotenv()MONGO_URI。这些变量在使用 TWILIO_SIDflask run 时具有正确的值,但在 Cloud Run 日志中没有。在 Cloud Run 上,这些变量等于 docker-compose

当我不使用 None 并直接将我的变量值放入 .env 时,没有任何问题并且我的 Cloud Run 链接工作正常。我还尝试将 /config/settings.py 移到配置文件之外和其他几个位置,但我仍然遇到同样的问题。

.env

Dockerfile

.
├── requirements.txt
├── Dockerfile
├── Docker-compose.yml
├── config    
│   ├── .env                           
│   ├── settings.py            
│   ├── gunicorn.py 
│   └── __init__.py 
├── web_messaging                   
│   ├── app.py      # where I am calling create_app() - factory pattern         
│   ├── blueprints              
│   ├── static                     
│   └── ...                 
└── ...

docker-compose.yml

FROM python:3.9-slim

ENV INSTALL_PATH /web_messaging
RUN mkdir -p $INSTALL_PATH

workdir $INSTALL_PATH

copY requirements.txt requirements.txt
RUN pip install -r requirements.txt

copY . .

CMD gunicorn -b 0.0.0.0:8080 --access-logfile - "web_messaging.app:create_app()"

config/.env

version: '2'

services:
  website:
    build: .
    command: >
      gunicorn -b 0.0.0.0:8080
        --access-logfile -
        --reload
        "web_messaging.app:create_app()"
    environment:
      PYTHONUNBUFFERED: 'true'
    volumes:
      - '.:/web_messaging'
    ports:
      - '8080:8080'

config/settings.py

COMPOSE_PROJECT_NAME=web_messaging
FLASK_SECRET=xxx
MONGO_URI=mongodb+srv://xxx
MONGO_DB=xxx
TWILIO_SID=xxx
TWILIO_TOKEN=xxx 

config/gunicorn.py

import os
from dotenv import load_dotenv
BASEDIR = os.path.abspath(os.path.dirname(__file__))


load_dotenv(os.path.join(BASEDIR,'.env'))

DEBUG = True
PYTHONDONTWRITEBYTECODE=1
#SERVER_NAME = '127.0.0.1:5000'


# Mongo Database
MONGO_dbnAME = os.getenv('MONGO_DB')
MONGO_URI = os.getenv('MONGO_URI')


# Twilio API 
FLASK_SECRET = os.getenv('FLASK_SECRET')
TWILIO_SID = os.getenv('TWILIO_SID')
TWILIO_TOKEN = os.getenv('TWILIO_TOKEN')
                                    

解决方法

已修复,我确切地发现出了什么问题,但我不知道为什么。

  • 在我构建自己的镜像之前,按照这些陡峭的步骤将镜像推送到 GCP 容器注册表时,它起作用了:

      docker-compose up --build
      docker tag 52e6159b6b13 gcr.io/mousset005/zoro
      gcloud auth configure-docker
      docker push gcr.io/mousset005/zoro
    

但是,我所做的是使用 GCP API(这是他们在 Cloud Run Python 快速入门中推荐的)使用该命令构建我的图像:

gcloud run deploy --image gcr.io/mousset005/zoro --platform managed

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?