Dockerfilepython3.9 , latest (dockerfile) Эти теги больше не поддерживаются или поддерживаются, они удаляются из репозитория GitHub, но последние версии, выдвинутые, все равно могут быть доступны в Docker Hub, если кто -то их тянет:
python3.9-alpine3.13python3.8python3.8-alpine3.11python3.7python3.7-alpine3.8python3.6python3.6-alpine3.8python2.7Последние теги даты для этих версий:
python3.9-alpine3.13-2024-03-11python3.8-2024-10-28python3.8-alpine3.11-2024-03-11python3.7-2024-10-28python3.7-alpine3.8-2024-03-11python3.6-2022-11-25python3.6-alpine3.8-2022-11-25python2.7-2022-11-25 Примечание : есть теги для каждой даты сборки. Если вам нужно «прикрепить» версию изображения Docker, которую вы используете, вы можете выбрать один из этих тегов. Например tiangolo/meinheld-gunicorn-flask:python3.9-2024-11-02 .
Docker Image с Meinheld, управляемый Gunicorn для высокопроизводительных веб-приложений в колбе с использованием Python с автоматической настройкой производительности.
Github Repo : https://github.com/tiangolo/meinheld-gunicorn-flask-docker
Docker Hub Изображение : https://hub.docker.com/r/tiangolo/meinheld-gunicorn-flask/
Веб -приложения Python Flask, работающие вместе с Meinheld, контролируемым одурцорном, имеют одни из лучших выступлений, достижимых Flask (*).
Если у вас уже есть уже существующее приложение в колбе или вы создаете новое, это изображение даст вам наилучшую возможную производительность (или близко к этому).
Это изображение включает в себя механизм «автоматической настройки», так что вы можете просто добавить свой код и автоматически получить хорошую производительность . И не принося жертвы (например, лесозаготовку).
Текущая последняя версия Meinheld выпущена 1,0,2, с 17 мая 2020 года. Эта версия Meinheld требует старой версии Greenlet ( >=0.4.5,<0.5 ), которая не совместима с Python 3.10 и 3.11. Вот почему последняя версия Python, поддерживаемая на этом изображении, - Python 3.9.
Если вы начинаете новый проект, вы можете извлечь выгоду из более новой и более высокой структуры, такой как Fastapi (на основе ASGI вместо WSGI, как Flask и Django), и изображение Docker, такое как Tiangolo/Uvicorn-Gunicorn-Fastapi .
Это даст вам около 200% производительность, достижимую с помощью колбы, даже при использовании этого изображения.
Кроме того, если вы хотите использовать новые технологии, такие как WebSockets, было бы проще с более новой структурой, основанной на ASGI, таких как Fastapi . Поскольку стандартный ASGI был разработан, чтобы иметь возможность обрабатывать асинхронный код, подобный тому, что необходимо для веб -билетов.
Meinheld -это высокопроизводительный веб-сервер WSGI.
Вы можете использовать снаряжение для управления Мейнхеддом и запустить несколько процессов.
Колба - это микропрофлик для Python, основанная на Werkzeug, Jinja 2 и добрых намерениях.
Это изображение было создано для того, чтобы стать альтернативой Tiangolo/Uwsgi-Nginx-Flask , обеспечивая около 400% производительность этого изображения.
Он основан на более общем изображении Tiangolo/Meinheld-Gunicorn . Это тот, который вы бы использовали для других фреймворков WSGI, таких как Джанго.
Вы, вероятно, используете Kubernetes или подобные инструменты. В этом случае вам, вероятно, не нужно это изображение (или любое другое подобное базовое изображение ). Вам, вероятно, лучше построить изображение Docker с нуля .
Если у вас есть кластер машин с Kubernetes , Docker Swarm Mode, Nomad или другой аналогичной сложной системой для управления распределенными контейнерами на нескольких машинах, то вы, вероятно, захотите обрабатывать репликацию на уровне кластера вместо использования диспетчера процессов в каждом контейнере, который запускает несколько рабочих процессов , что делает это изображение Docker.
В этих случаях (например, использование Kubernetes) вы, вероятно, захотите построить изображение Docker с нуля , установить ваши зависимости и запустить один процесс вместо этого изображения.
Например, с помощью стреляющегося у вас может быть файловое app/gunicorn_conf.py с:
# Gunicorn config variables
loglevel = "info"
errorlog = "-" # stderr
accesslog = "-" # stdout
worker_tmp_dir = "/dev/shm"
graceful_timeout = 120
timeout = 120
keepalive = 5
threads = 3 И тогда у вас может быть Dockerfile с:
FROM python:3.9
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD [ "gunicorn" , "--conf" , "app/gunicorn_conf.py" , "--bind" , "0.0.0.0:80" , "app.main:app" ]Вы можете прочитать больше об этих идеях в документации FastAPI о: FastAPI в контейнерах - Docker, так как те же идеи будут применяться к другим веб -приложениям в контейнерах.
Вы можете хотеть, чтобы диспетчер процессов запускал несколько рабочих процессов в контейнере, если ваше приложение достаточно простое , чтобы вам не нужно (по крайней мере, пока), чтобы точно настроить количество процессов слишком много, и вы можете просто использовать автоматизированный по умолчанию, и вы запускаете его на одном сервере , а не в кластере.
Вы можете развернуть на один сервер (не кластер) с Docker Compose , так что у вас не будет простого способа управления репликацией контейнеров (с Docker Compose) при сохранении общей сети и балансировки нагрузки .
Тогда вы могли бы захотеть иметь один контейнер с диспетчера процессов, запускающего несколько рабочих процессов внутри, как это делает это изображение Docker.
У вас также могут быть и другие причины , которые облегчат наличие одного контейнера с несколькими процессами вместо того, чтобы иметь несколько контейнеров с одним процессом в каждом из них.
Например (в зависимости от вашей настройки) у вас может быть какой -то инструмент, такой как экспортер Prometheus в том же контейнере, который должен иметь доступ к каждому из представленных запросов .
В этом случае, если бы у вас было несколько контейнеров , по умолчанию, когда Прометеус пришел к прочтению метрик , он каждый раз получал бы один для одного контейнера (для контейнера, который обрабатывал этот конкретный запрос) вместо получения накопленных метрик для всех реплицированных контейнеров.
Затем, в этом случае, может быть проще иметь один контейнер с несколькими процессами и локальный инструмент (например, экспортер Prometheus) на одном и том же контейнере, собирающем метрики Prometheus для всех внутренних процессов и выявляя эти метрики на этом единственном контейнере.
Узнайте больше об этом в документации FastAPI о: FastAPI в контейнерах - Docker, так как те же концепции применимы к другим веб -приложениям в контейнерах.
Вам не нужно клонировать это репо.
Вы можете использовать это изображение в качестве базового изображения для других изображений.
Предполагая, что у вас есть файл requirements.txt , у вас может быть Dockerfile как это:
FROM tiangolo/meinheld-gunicorn-flask:python3.9
COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./app /app Он ожидает файла по адресу /app/app/main.py main.py.
Или иным образом файл на /app/main.py .
И ожидать, что оно содержит переменное app с вашим приложением "WSGI".
Затем вы можете построить свое изображение из каталога, в котором есть ваш Dockerfile , например:
docker build -t myimage ./Это переменные среды, которые вы можете установить в контейнере для его настройки и их значений по умолчанию:
MODULE_NAME«Модуль Python» (файл), который будет импортирован надзором, этот модуль будет содержать фактическое приложение Flask в переменной.
По умолчанию:
app.main , если есть файл /app/app/main.py main.py илиmain , если есть файл /app/main.py Например, если ваш основной файл был по адресу /app/custom_app/custom_main.py , вы можете установить его как:
docker run -d -p 80:80 -e MODULE_NAME= " custom_app.custom_main " myimageVARIABLE_NAMEПеременная внутри модуля Python, которая содержит приложение Flask.
По умолчанию:
appНапример, если в вашем основном файле Python есть что -то вроде:
from flask import Flask
api = Flask ( __name__ )
@ api . route ( "/" )
def hello ():
return "Hello World from Flask" В этом случае api будет переменной с «приложением колбы». Вы можете установить это как:
docker run -d -p 80:80 -e VARIABLE_NAME= " api " myimageAPP_MODULEСтрока с модулем Python и именем переменной передано стрелке.
По умолчанию, установите на основе переменных MODULE_NAME и VARIABLE_NAME :
app.main:app илиmain:appВы можете установить это как:
docker run -d -p 80:80 -e APP_MODULE= " custom_app.custom_main:api " myimageGUNICORN_CONFПуть к файлу конфигурации пионога питона.
По умолчанию:
/app/gunicorn_conf.py , если он существует/app/app/gunicorn_conf.py , если он существует/gunicorn_conf.py (включены по умолчанию)Вы можете установить это как:
docker run -d -p 80:80 -e GUNICORN_CONF= " /app/custom_gunicorn_conf.py " myimageWORKERS_PER_COREЭто изображение будет проверять, сколько ядер ЦП доступно на текущем сервере, работающем с вашим контейнером.
Он установит количество работников на количество ядер ЦП, умноженные на это значение.
По умолчанию:
2Вы можете установить это как:
docker run -d -p 80:80 -e WORKERS_PER_CORE= " 3 " myimage Если бы вы использовали значение 3 на сервере с 2 ядрами процессора, оно запустило бы 6 рабочих процессов.
Вы также можете использовать значения с плавающей запятой.
Так, например, если у вас есть большой сервер (скажем, с 8 ядрами процессора), запускающим несколько приложений, и у вас есть приложение ASGI, которое, как вы знаете, не нуждается в высокой производительности. И вы не хотите тратить ресурсы сервера. Вы можете заставить его использовать 0.5 работников на CPU Core. Например:
docker run -d -p 80:80 -e WORKERS_PER_CORE= " 0.5 " myimageНа сервере с 8 ядрами процессора это заставит его запустить только 4 рабочих процесса.
WEB_CONCURRENCYПереопределить автоматическое определение количества работников.
По умолчанию:
WORKERS_PER_CORE . Таким образом, на сервере с 2 ядрами, по умолчанию он будет установлен на 4 .Вы можете установить это как:
docker run -d -p 80:80 -e WEB_CONCURRENCY= " 2 " myimageЭто сделало бы образ начала 2 рабочих процесса, независимо от того, сколько ядер ЦП доступно на сервере.
HOST«Хозяин», используемый стрелком, ИП, где стреляющий в состав прослушивания прослушивает запросы.
Это хост внутри контейнера.
Так, например, если вы установите эту переменную на 127.0.0.1 , она будет доступна только внутри контейнера, а не на хосте, который он использует.
Это предусмотрено для полноты, но вы, вероятно, не должны ее менять.
По умолчанию:
0.0.0.0PORTПорт, который контейнер должен слушать.
Если вы запускаете свой контейнер в ограничительной среде, которая заставляет вас использовать какой -то конкретный порт (например, 8080 ), вы можете установить его с этой переменной.
По умолчанию:
80Вы можете установить это как:
docker run -d -p 80:8080 -e PORT= " 8080 " myimageBINDФактический хозяин и порт перешли к стреляющемуся.
По умолчанию установите на основе HOST переменных и PORT .
Так что, если вы ничего не изменили, это будет установлено по умолчанию:
0.0.0.0:80Вы можете установить это как:
docker run -d -p 80:8080 -e BIND= " 0.0.0.0:8080 " myimageLOG_LEVELУровень бревна для стрелкового коса.
Один из:
debuginfowarningerrorcritical По умолчанию установите на info .
Если вам нужно сжать больше, например, принося в жертву производительность, установите его на warning , например:
Вы можете установить это как:
docker run -d -p 80:8080 -e LOG_LEVEL= " warning " myimage Журналы отправляются в stderr и stdout контейнера, что означает, что вы можете просмотреть журналы с помощью команды docker logs -f your_container_name_here .
Изображение включает в себя файл конфигурации Python Python по умолчанию по адресу /gunicorn_conf.py .
Он использует переменные среды, объявленные выше, чтобы установить все конфигурации.
Вы можете переопределить его, включив файл в:
/app/gunicorn_conf.py/app/app/gunicorn_conf.py/gunicorn_conf.py/app/prestart.sh Если вам нужно что -либо запустить перед запуском приложения, вы можете добавить файл prestart.sh в Directory /app . Изображение автоматически обнаружит и запустит его перед началом всего.
Например, если вы хотите добавить миграции SQL Alembic SQL (с SQLALCHEMY), вы можете создать файл ./app/prestart.sh в свой каталог кода (который будет скопирован вашим Dockerfile ) с::
#! /usr/bin/env bash
# Let the DB start
sleep 10 ;
# Run migrations
alembic upgrade head И будет ждать 10 секунд, чтобы дать базе данных некоторое время, чтобы запустить, а затем запустить эту команду alembic .
Если вам нужно запустить скрипт Python перед запуском приложения, вы можете сделать файл /app/prestart.sh запустить свой скрипт Python, с чем -то вроде:
#! /usr/bin/env bash
# Run custom Python script before starting
python /app/my_custom_prestart_script.py Короче говоря: вы, вероятно, не должны использовать Alpine для проектов Python, вместо этого использовать версии изображения slim Docker.
Вы хотите больше подробностей? Продолжить чтение?
Alpine более полезен для других языков, где вы строите статический двоичный файл на одной стадии изображения Docker (используя многоэтапное здание Docker), а затем копируете его на простое альпийское изображение, а затем просто выполнить этот двоичный. Например, используя GO.
Но для Python, поскольку Alpine не использует стандартное инструменты, используемое для построения расширений Python, при установке пакетов во многих случаях Python ( pip ) не найдет предварительно скомпилированный пакет («колесо») для альпийского. И после отладки множество странных ошибок вы поймете, что вам нужно установить много дополнительных инструментов и создать много зависимостей, чтобы использовать некоторые из этих общих пакетов Python. ?
Это означает, что, хотя исходное альпийское изображение могло быть небольшим, вы получите изображение с размером, сравнимым с размером, который вы бы получили, если бы только использовали стандартное изображение Python (на основе Debian) или в некоторых случаях еще больше. ?
И во всех этих случаях, для строительства, потребления гораздо большего количества ресурсов потребуется гораздо больше времени, потребление гораздо больше ресурсов, дольше строить зависимости, а также увеличить его углеродный след, поскольку вы используете больше времени и энергии процессора для каждой сборки. ?
Если вам нужны стройные изображения Python, вам следует вместо этого попытаться использовать slim версии, которые все еще основаны на Debian, но меньше. ?
Все теги изображения, конфигурации, переменные среды и параметры приложения протестированы.
issue-manager.yml . PR #154 от @tiangolo.latest-changes действие GitHub. PR #153 от @tiangolo.latest-changes.yml . PR #141 от @alejsdev.README.md . PR #137 от @alejsdev. Основные моменты этого выпуска:
Поддержка Python 3.9 и 3.8.
Университет Python 3.6 и 2,7.
python3.6-2022-11-25 и python2.7-2022-11-25 .Модернизированные версии всех зависимостей.
Небольшие улучшения и исправления.
Добавьте поддержку Python 3.9 и Python 3.9 Alpine. PR #50 от @tiangolo.
Добавьте Python 3.8 с Alpine 3.11. PR #28.
Добавьте поддержку Python 3.8. PR #27.
tiangolo/meinheld-gunicorn-flask:python3.7-2019-10-15 . PR #17.Добавьте поддержку Python 2.7 (вы должны использовать Python 3.7 или Python 3.6). PR #11.
Обновите конфигурацию Travis CI. PR #10 от @cclauss.
/app/prestart.sh . Этот проект лицензирован в соответствии с условиями лицензии MIT.