Google Cloud Run 不加载 .env 文件

Pie*_*dre 6 python docker docker-compose google-cloud-run python-dotenv

我花了最近几天的时间试图找出我做错了什么,但我仍然无法弄清楚,因为我能够flask run使用docker-compose up --build. 源代码在这里

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

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    
Run Code Online (Sandbox Code Playgroud)

我有一个config/.env文件和一个config/settings.py. 我从加载ENV变量.env使用 load_dotenv()上我的config/settings.py。我决定在 my 中添加一些 print 和 try/expect 语句config/settings.py来查看变量的值。

设置.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)
Run Code Online (Sandbox Code Playgroud)

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

  • BASEDIR值是/web_messaging/config
  • load_dotenv()通话过程中无异常

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

当我不使用 a.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                     
?   ??? ...                 
??? ...
Run Code Online (Sandbox Code Playgroud)

文件

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()"
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

配置/.env

COMPOSE_PROJECT_NAME=web_messaging
FLASK_SECRET=xxx
MONGO_URI=mongodb+srv://xxx
MONGO_DB=xxx
TWILIO_SID=xxx
TWILIO_TOKEN=xxx 
Run Code Online (Sandbox Code Playgroud)

配置/设置.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')
                                    
Run Code Online (Sandbox Code Playgroud)

配置/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'
                              
Run Code Online (Sandbox Code Playgroud)

Pie*_*dre 4

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

  • 当我在构建自己的镜像之前将镜像推送到 GCP 容器注册表上时,它就起作用了:

      docker-compose up --build
      docker tag 52e6159b6b13 gcr.io/mousset005/zoro
      gcloud auth configure-docker
      docker push gcr.io/mousset005/zoro
    
    Run Code Online (Sandbox Code Playgroud)

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

gcloud run deploy --image gcr.io/mousset005/zoro --platform managed
Run Code Online (Sandbox Code Playgroud)

  • 您能告诉一下,这里如何使用 .env 文件吗?gcloud run 如何获取 .env 文件 (3认同)