#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