Обработка переменных среды в flask с развертыванием docker

#python #docker #flask

#python #docker #flask

Вопрос:

Я настраиваю flask с помощью docker. У меня есть два способа установки переменных среды: один в .cfg файлах flask, а другой в .env файлах docker.

Мне интересно, какой из них является лучшей практикой. Оценивая плюсы и минусы, если я перемещу свои переменные среды .env в файлы docker, мне придется выполнять os.environ.get все действия во всех местах моего кода приложения, включая обработку значений по умолчанию, что приводит к дополнительной зависимости внутри приложения от переменных среды ОС. С другой стороны, добавление переменных среды, таких как пароль базы данных, секретные ключи и т. Д., В конфигурацию flask может быть неправильной идеей, хотя все мои переменные среды и значения по умолчанию будут находиться в одном месте.

Ответ №1:

Вам не нужно соглашаться на одно или другое.

Использование переменных среды для настройки каждого аспекта вашего приложения, включая пароли БД, не является необычной практикой. Это часто практикуется в контейнерных средах, таких как Kubernetes, или при использовании секретов docker, поскольку они дают возможность хранить важную информацию в зашифрованном виде и монтировать ее в качестве переменной среды в вашем контейнере.

Вы можете напрямую проверять в своем приложении значения переменных среды или другим вариантом является наличие точки входа в docker, которая проверяет наличие этих значений и в конечном итоге создает файл конфигурации, который вы используете в своем приложении. Этот последний параметр позволяет вам использовать переменные среды для настройки вашего приложения, или, если вы не хотите, вы можете напрямую подключить файл конфигурации к вашему контейнеру, полностью пропустив envs.

Это используется, например, в образе docker logstash.

Ответ №2:

Просто чтобы добавить к отличному ответу Эстебана Гарсии, еще один хороший способ — использовать оба. Имейте конфигурационный файл, конфигурации на основе классов здесь великолепны, потому что вы можете воспользоваться преимуществами наследования конфигурации и иметь там все нечувствительные параметры. Для конфиденциальных данных, таких как секреты, пароли базы данных и т. Д., Определите их прямо в конфигурации, os.environ.get Чтобы извлечь эти значения из среды. В итоге это выглядит так:

 class DefaultConfig(Config):
    TESTING = False
    DEBUG = False
    SECRET_KEY = os.getenv('APP_SECRET_KEY')
    SQLALCHEMY_DATABASE_URI = os.getenv('APP_DATABASE_URI')
 

Таким образом, вы можете продолжать использовать app.config и не должны делать os.environ.get все в своем приложении.

Ответ №3:

Это мои 2 цента за тему.

Проблема

Я работал над переносом приложения flask в docker и хотел переместить мои settings.py переменные конфигурации в переменные env, чтобы они были подобраны env контейнера. Таким образом, его проще развернуть во внешней службе, такой как ECS, просто установив переменные env, и приложение останется прежним.

Потому что у меня было много конфигурационных переменных на settings.py и не желая настраивать каждый из них вручную при создании приложения flask, я придумал следующее решение.

Кроме того, я буду использовать docker-compose для выполнения всех контейнеров.

Миграция из .py в .env

Первое, что нужно сделать, это перейти от кода python к синтаксису, совместимому с docker-compose. Итак, если у вас есть это в settings.py :

 # *****************************
# Environment specific settings
# *****************************

# DO NOT use "DEBUG = True" in production environments
DEBUG = True

# DO NOT use Unsecure Secrets in production environments
SECRET_KEY = 'This is an UNSECURE Secret. CHANGE THIS for production environments.'

# SQLAlchemy settings
SQLALCHEMY_DATABASE_URI = 'postgresql:///../app.postgresql'
 

Переименуйте этот файл в settings.env и измените содержимое на:

 # *****************************
# Environment specific settings
# *****************************

# DO NOT use "DEBUG=True" in production environments
DEBUG=True

# DO NOT use Unsecure Secrets in production environments
SECRET_KEY=This is an UNSECURE Secret. CHANGE THIS for production environments.

# SQLAlchemy settings
SQLALCHEMY_DATABASE_URI=postgresql:///../app.postgresql
 

Обратите внимание, что вы должны удалить все пробелы и кавычки (двойные и одиночные)

После этого вам нужно загрузить этот файл в docker-compose.файл yaml:

 version: '3.1'
services:
    web:
        image: web-server
        env_file: path_to/settings.env
 

Затем, когда вы создаете приложение Flask, выполните следующие действия:

 # Instantiate Flask
app = Flask(__name__)

for variable, value in os.environ.items():
    app.config[env_name] = value
 

Если вы не хотите загружать все доступные переменные среды в flask

Вы можете добавить префикс к переменным settings.env следующим образом:

 YOURAPP_DEBUG=True
 

А затем при создании приложения:

 # Instantiate Flask
app = Flask(__name__)

for variable, value in os.environ.items():
    if variable.startswith("YOURAPP_"):
        env_name = variable.split("YOURAPP_")[1]
        app.config[env_name] = value