TL; доктор
Этот пост заполнен примерами, начиная от простого докерафила до многоступенчатого производства для приложений Python. Вот быстрый резюме того, что это руководство покрывает:
- Использование соответствующего базового изображения (Debian для Dev, Alpine для производства).
- Использование
боевик
для горячей перезагрузки во время развития. - Оптимизация для слоев докеров кэша – размещение команд в правильном порядке, так что
PIP Установить
выполняется только при необходимости. - Сервирование статических файлов (расслоения, сгенерированные через React/Vue/Angular), используя
колбу
Статические и шаблонные папки. - Использование многоступенчатых
альпийский
Создать для уменьшения окончательного размера изображения для производства. - #Bonus – с использованием Gunicorn
наград
и--reload_extra_files.
Для просмотра изменений в файлах (HTML, CSS и JS включены) во время разработки.
Если вы хотите прыгнуть прямо в код, проверьте Github repo Отказ
Содержание
- Простое докерафиль и .Dockerignore
- Горячая перезагрузка с гурущим
- Запуск одного сценария Python
- Обслуживание статических файлов
- Одноступенчатый производственный сбор
- Многоступенчатая продукция
Давайте предположим простую структуру каталогов. Приложение называется 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”