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

时间:2020-03-09 16:35:19

标签: bash docker variables docker-compose

这是我的项目在主持人处进行的组织

   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}

config.py

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')

auth.py

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.

我想念什么?

1 个答案:

答案 0 :(得分:0)

这肯定看起来像您需要按照the 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对象。

但是,此方法避免将变量加载到主机的外壳中,而是将其设置在特定服务中。它还分隔了安全证书,因此您可以将docker-compose.yml提交给源代码管理。