python - Google Cloud Run 不加载 .env 文件

标签 python docker docker-compose google-cloud-run

我花了最近几天的时间试图找出我做错了什么,但我仍然无法弄清楚,因为我能够使用 flask run 在本地运行该应用程序|并且还使用 Docker 使用 docker-compose up --build . Source code is here
我的问题是当我单击 URL 时,我的 Cloud Run 部署成功但服务不可用.我检查了日志,似乎我的环境变量没有正确加载:

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 .我正在从 .env 加载环境变量使用 load_dotenv()在我的 config/settings.py .我决定在我的 config/settings.py 中添加一些 print 和 try/expect 语句。查看变量的值。
设置.py
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)
当我使用 Flask run、docker-compose 或 cloud-run 运行时:
  • BASEDIR值为 /web_messaging/config
  • load_dotenv()期间没有异常(exception)调用

  • 但是,有一个主要区别,它是我的 env 变量的值,例如 MONGO_URI , TWILIO_SID .使用 flask run 时,这些变量具有正确的值和 docker-compose但不在 Cloud Run 日志中。在 Cloud Run 上,这些变量等于 None .
    当我不使用 .env 时并直接将我的变量的值放入 /config/settings.py ,没有问题,我的 Cloud Run 链接工作正常。我也试过搬家.env在配置文件之外和其他几个位置,但我仍然遇到同样的问题。
    .
    ├── 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                     
    │   └── ...                 
    └── ...
    
    Dockerfile
    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()"
    
    docker-compose.yml
    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'
    
    配置/.env
    COMPOSE_PROJECT_NAME=web_messaging
    FLASK_SECRET=xxx
    MONGO_URI=mongodb+srv://xxx
    MONGO_DB=xxx
    TWILIO_SID=xxx
    TWILIO_TOKEN=xxx 
    
    配置/设置.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')
                                        
    
    配置/gunicorn.py
    bind = '0.0.0.0:8080'
    accesslog = '-'
    access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" in %(D)sµs'
                                  
    

    最佳答案

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

  • 在我构建自己的镜像之前,它在遵循这些陡峭的步骤将镜像推送到 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
    

    关于python - Google Cloud Run 不加载 .env 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66951042/

    相关文章:

    python - 如何将 Pyramid 与 Tornado 结合使用

    mysql - 错误 2002 (HY000) : Can't connect to local MySQL server through socket

    docker compose 文件无效,不允许使用附加属性 tty

    docker - 如何在 docker v2 中指示 azureSubscriptionEndpoint

    php - Docker - 在 PHP 容器内使用 Composer

    具有确定性端口绑定(bind)的 Docker 规模

    Docker run --entrypoint 带多个参数

    python - 检测 gtk.treeview 中的列何时调整大小

    python - 全局变量在Python并行编程中如何工作?

    python - 在轴上放置文本值而不是数值