繁体   English   中英

Docker-compose - 使用脚本将环境变量传递给 Flask

[英]Docker-compose - passing environment variables to Flask using script

这是我在主机上的项目结构:

   set_env_vars.sh
              dev/
                 docker-compose-dev.yml
                 /services/
                          web/
                             .env-dev?  <------
                             project/
                                    config.py
                                    api/
                                       resources/
                                                auth.py

set_env_vars.sh

export SPOTIFY_CLIENT_ID=my_id
export SPOTIFY_CLIENT_SECRET=my_secret
export SPOTIFY_REDIRECT_URI=http://localhost
export SPOTIFY_CACHE_PATH=/project/api/auth/spotify/.cache

我像这样运行:

$ source ./set_env_vars.sh

docker-compose-dev.yml

services:

  web:
    environment:
      - FLASK_ENV=development
      - APP_SETTINGS=project.config.DevelopmentConfig
      - SPOTIFY_CLIENT_ID=${SPOTIFY_CLIENT_ID}
      - SPOTIFY_CLIENT_SECRET=${SPOTIFY_CLIENT_SECRET}
      - SPOTIFY_REDIRECT_URI=${SPOTIFY_REDIRECT_URI}
      - SPOTIFY_CACHE_PATH=${SPOTIFY_CACHE_PATH}

配置文件

class DevelopmentConfig(BaseConfig):
    SPOTIFY_CLIENT_ID = os.environ.get('SPOTIFY_CLIENT_ID')
    SPOTIFY_CLIENT_SECRET = os.environ.get('SPOTIFY_CLIENT_SECRET')
    SPOTIFY_REDIRECT_URI_ = os.environ.get('SPOTIFY_REDIRECT_URI')
    SPOTIFY_CACHE_PATH = os.environ.get('SPOTIFY_CACHE_PATH')

授权文件

from project.config import DevelopmentConfig

sp = spotipy.Spotify(auth_manager=spotipy.oauth2.SpotifyOAuth(
      DevelopmentConfig.SPOTIFY_CLIENT_ID,
      DevelopmentConfig.SPOTIFY_CLIENT_SECRET,
      DevelopmentConfig.SPOTIFY_REDIRECT_URI,
      scope=DevelopmentConfig.SCOPE, 
      cache_path=DevelopmentConfig.SPOTIFY_CACHE_PATH))

但我收到以下错误:

spotipy.oauth2.SpotifyOauthError: No client_id. Pass it or set a SPOTIPY_CLIENT_ID environment variable.

我错过了什么?

这当然看起来像您需要按照docs传递带有SPOTIPY_拼写的变量。

但是我也注意到您的代码多次重复相同的变量名称。 当您尝试在多个文件中维护相同的变量名称时,这可能会导致拼写错误。

解决此问题的更简单方法可能是将变量包含在.env-dev文件中:

SPOTIPY_CLIENT_ID=my_id
SPOTIPY_CLIENT_SECRET=my_secret
SPOTIPY_REDIRECT_URI=http://localhost
SPOTIPY_CACHE_PATH=/project/api/auth/spotify/.cache

然后在你docker-compose-dev.yml文件中加载这些:

services:
  web:
    env_file:
      - .env-dev

然后在您的 Python 代码中,您可以执行以下操作:

import os, DevelopmentConfig

sp = spotipy.Spotify(auth_manager=spotipy.oauth2.SpotifyOAuth(
      os.environ.get('SPOTIPY_CLIENT_ID'),
      os.environ.get('SPOTIPY_CLIENT_SECRET'),
      os.environ.get('SPOTIPY_REDIRECT_URI'),

      scope=DevelopmentConfig.SCOPE, 

      cache_path = os.environ.get('SPOTIPY_CACHE_PATH')))

尽管加载配置会绕过这些变量的config.DevelopmentConfig对象,但此方法的重复较少。

然而,这种方法避免将变量加载到主机的 shell 中,而是将它们设置在特定服务中。 它还分离了安全证书,因此您可以将 docker docker-compose.yml提交到源代码控制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM