Docker -compose - передача переменных среды в Flask с помощью скрипта - PullRequest
0 голосов
/ 09 марта 2020

Это мой проект на хосте:

   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 голосов
/ 10 марта 2020

Это, безусловно, выглядит так, как будто вам нужно передать переменные с написанием 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 объект для этих переменных.

Однако этот метод избегает загрузки переменных в оболочку хоста и вместо этого устанавливает их внутри определенной c службы. Он также разделяет secerts, так что вы можете передать docker-compose.yml в систему контроля версий

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...