Рубрики
Без рубрики

Как написать Dockerfiles для веб-приложений Python

TL; DR Этот пост заполнен примерами, начиная от простого докерафила до многоступенчатого … Теги с WebDev, Docker, Django, Python.

TL; доктор

Этот пост заполнен примерами, начиная от простого докерафила до многоступенчатого производства для приложений Python. Вот быстрый резюме того, что это руководство покрывает:

  • Использование соответствующего базового изображения (Debian для Dev, Alpine для производства).
  • Использование боевик для горячей перезагрузки во время развития.
  • Оптимизация для слоев докеров кэша – размещение команд в правильном порядке, так что PIP Установить выполняется только при необходимости.
  • Сервирование статических файлов (расслоения, сгенерированные через React/Vue/Angular), используя колбу Статические и шаблонные папки.
  • Использование многоступенчатых альпийский Создать для уменьшения окончательного размера изображения для производства.
  • #Bonus – с использованием Gunicorn наград и --reload_extra_files. Для просмотра изменений в файлах (HTML, CSS и JS включены) во время разработки.

Если вы хотите прыгнуть прямо в код, проверьте Github repo Отказ

Содержание

  1. Простое докерафиль и .Dockerignore
  2. Горячая перезагрузка с гурущим
  3. Запуск одного сценария Python
  4. Обслуживание статических файлов
  5. Одноступенчатый производственный сбор
  6. Многоступенчатая продукция

Давайте предположим простую структуру каталогов. Приложение называется Python-App. Каталог верхнего уровня имеет Dockerfile и SRC папка.

Исходный код вашего приложения Python будет в SRC папка. Он также содержит зависимости приложений в требования .txt файл. Для краткости давайте предположим, что Server.py определяет сервер Flask, работающий на порту 8080.

python-app
├── Dockerfile
└── src
    └── server.py
    └── requirements.txt

1. Простой пример докерафила

Для базового изображения мы использовали последнюю версию Python: 3.6.

Во время сборки изображений Docker принимает все файлы в контекст каталог. Чтобы увеличить производительность Docker Build, исключить файлы и каталоги, добавив .Dockerignore Файл в контекстный каталог.

Как правило, ваш .Dockerignore Файл должен быть:

.git
__pycache__
*.pyc
*.pyo
*.pyd
.Python
env

Создайте и запустите это изображение:

$ cd python-docker
$ docker build -t python-docker-dev .
$ docker run --rm -it -p 8080:8080 python-docker-dev

Приложение будет доступно в http://localhost: 8080 Отказ Использовать Ctrl + C бросить.

Теперь скажем, вы хотите, чтобы это работало каждый раз, когда вы меняете свой код. то есть местное развитие. Затем вы сможете установить файлы исходного кода в контейнер для запуска и остановки сервера Python.

$ docker run --rm -it -p 8080:8080 -v $(pwd):/app \
             python-docker-dev bash
root@id:/app# python src/server.py

2. Горячая перезагрузка с гурущим

боевик это HTTP-сервер Python WSGI для Unix и модели рабочей силы перед вилкой. Вы можете настроить Gunicorn, чтобы использовать несколько вариантов. Вы можете передать наград в команду Gunicorn или поместите его в файл конфигурации. Если какие-либо файлы меняются, Gunicorn автоматически перезапустит свой Python Server.

Мы построим изображение и запустим Gunicorn так, чтобы код был восстановлен, когда есть какие-либо изменения внутри приложение каталог.

$ cd python-docker
$ docker build -t python-hot-reload-docker .
$ docker run --rm -it -p 8080:8080 -v $(pwd):/app \
             python-hot-reload-docker bash
root@id:/app# gunicorn --config ./gunicorn_app/conf/gunicorn_config.py gunicorn_app:app

Все редактирует файлы Python в приложение Справочник будет вызвать восстановление и изменения будут доступны в прямом эфире в http://localhost: 8080 Отказ Обратите внимание, что мы установили файлы в контейнер, чтобы на самом деле мог работать боевик.

Как насчет других файлов? Если у вас есть другие типы файлов (шаблонов, просмотров и т. Д.), которые вы хотите, чтобы Gunicorn посмотреть для изменения кода, вы можете указать типы файлов в Reload_Extra_files аргумент Он принимает массив файлов.

3. Запуск одного сценария Python

Для простых одно файловых скриптов вы можете запустить сценарий Python с помощью изображения Python с Docker Run.

docker run -it --rm --name single-python-script -v "$PWD":/app -w /app python:3 python your-daemon-or-script.py

Вы также можете пройти некоторые аргументы в ваш сценарий Python. В приведенном выше примере мы установили текущий рабочий каталог, который также позволяет файлы в этом каталоге для передачи в качестве аргументов.

4. Обслуживание статических файлов

Вышеприведенное DockerFile предположил, что вы используете сервер API с Python. Допустим, вы хотите служить вашему raction.js/vue.js/angular.js приложению с помощью python. Flask обеспечивает быстрый способ рендеринга статических файлов. Ваш HTML должен присутствовать внутри Шаблоны Папка и ваши CSS, JS, изображения должны присутствовать внутри статический папка.

Проверьте образец Hello World Static App Structor здесь Отказ

На вашем сервере.

if __name__ == ' __main__':
    app.run(host='0.0.0.0')

Обратите внимание на хост, 0,0.0.0 – Это позволяет вашему контейнеру доступно снаружи. По умолчанию, если вы не даете хост, он связывается только для localhost интерфейс.

5. Одноступенчатый производственный сбор

Создайте и запустите все в одном изображении:

$ cd python-docker
$ docker build -t python-docker-prod .
$ docker run --rm -it -p 8080:8080 python-docker-prod

Построенный образ будет ~ 700 МБ (в зависимости от исходного кода) из-за базового уровня Debian. Давайте посмотрим, как мы можем сократить это.

6. Многоступенчатая продукция

С многоступенчатым сборками, вы используете несколько От Заявления в вашем DockerFile, но в финальной стадии сборки будет использоваться, что в идеале будет крошечное производственное изображение только с точными зависимостями, необходимыми для производственного сервера.

Это будет действительно полезно, когда вы используете системные зависимые модули или те, которые требуют компиляции и т. Д. Pycrypto. , numpy Хорошие примеры этого типа.

С вышеизложенным изображением, построенным с Alpine, составляет около ~ 90 МБ, увеличение размера 8x. альпийский Вариант обычно является очень безопасным выбором для уменьшения размеров изображений.

Примечание: Все вышеперечисленные Dockerfiles были написаны с Python 3 – То же самое можно реплицировать для Python 2 с небольшим без изменений. Если вы хотите развернуть ваш Джанго Приложение, вы должны быть в состоянии развернуть приложение для готового производства с минимальными настройками на приведенные выше.

Любые предложения по улучшению идей выше? Любые другие случаи использования, которые вы хотели бы увидеть? Дайте мне знать в комментариях.

Присоединяйтесь к обсуждению на Reddit и Hackernews 🙂

Оригинал: “https://dev.to/hasurahq/how-to-write-dockerfiles-for-python-web-apps-5bmn”