- Оригинальный адрес:How to write Dockerfiles for Python Web Apps
- Оригинальный автор:Praveen Durairaj
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:lsvih
- Корректор:Starriers, steinliber
TL;DR
В этой статье рассматриваются примеры от создания простого файла Dockerfile до создания приложения Python на нескольких этапах производства. Ниже приводится краткое изложение содержания этого руководства:
- Используйте соответствующий базовый образ (debian для разработки, alpine для производства).
- использовать во время разработки
gunicorn
Делайте горячую перезагрузку. - Оптимизация уровня кеша Docker — используйте команды в правильном порядке, запускайте только при необходимости
pip install
. - использовать
flask
статические каталоги и каталоги шаблонов для развертывания статических файлов (например, пакетов, созданных React, Vue, Angular). - использовать
alpine
Выполняйте многоэтапные сборки в производственной среде, чтобы уменьшить размер конечного файла образа. - #easter egg — Вы можете использовать пушечную скорлупу во время разработки
--reload
и--reload_extra_files
Следите за файлами (включая html, css и js) для модификации.
Если вам нужен код для вышеуказанных шагов, см.GitHub repo.
содержание
- Простой Dockerfile с .dockerignore
- Горячая перезагрузка с пушечным огнем
- Запустите однофайловый скрипт Python
- Развертывание статических файлов
- Прямая сборка в производстве
- Многоэтапные сборки в производстве
Предположим, у нас есть приложение под названием python-app, подготовим для него простую структуру каталогов. в каталоге верхнего уровня, содержащемDockerfile
а такжеsrc
папка.
Исходный код приложения Python хранится вsrc
каталог, зависимости приложения хранятся вrequirements.txt
внутри. Для краткости предположим, что server.py определяет службу flask, работающую на порту 8080.
python-app
├── Dockerfile
└── src
└── server.py
└── requirements.txt
1. Простой пример Dockerfile
FROM python:3.6
# 创建 app 目录
WORKDIR /app
# 安装 app 依赖
COPY src/requirements.txt ./
RUN pip install -r requirements.txt
# 打包 app 源码
COPY src /app
EXPOSE 8080
CMD [ "python", "server.py" ]
Мы будем использовать последнюю версиюpython:3.6
как базовое изображение.
При создании образа docker извлекает все файлы, расположенные по адресуcontext
файлы в каталоге. Чтобы повысить скорость сборки докеров, вы можете добавить в контекстную директорию.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](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. Используйте Gunicorn для горячего обновления
gunicornЭто HTTP-сервер Python WSGI, работающий под Unix и использующий модель pre-fork worker (обратите внимание, Arbiter является мастером gunicorn, поэтому gunicorn называется pre-fork worker). Вы можете настроить gunicorn с различными параметрами. Пройдите в команду Gunicorn--reload
или будетreload
Написав файл конфигурации, gunicorn может автоматически перезапустить службу python при изменении файла.
FROM python:3.6
# 创建 app 目录
WORKDIR /app
# 安装 app 依赖
COPY gunicorn_app/requirements.txt ./
RUN pip install -r requirements.txt
# 打包 app 源码
COPY gunicorn_app /app
EXPOSE 8080
Создадим образ и запустим gunicorn наapp
Пересоберите код при изменении файлов в каталоге.
$ 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
всеapp
Изменения каталога файлов Python вызовут перестройку, изменения могут быть[http://localhost:8080](http://localhost:8080.)
Показать в реальном времени. Обратите внимание, что мы смонтировали файл в контейнер, поэтому gunicorn будет работать.
А файлы других форматов?Если вы хотите, чтобы 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
Вы также можете передать некоторые параметры скрипту. В приведенном выше примере мы смонтировали текущий рабочий каталог, а это означает, что файлы в каталоге могут быть переданы в качестве параметров.
4. Разверните статические файлы
Приведенный выше Dockerfile предполагает, что вы используете сервер API на Python. Если вы хотите обслуживать приложения React.js, Vue.js, Angular.js с помощью Python, вы можете использовать Flask. Flask предоставляет удобный способ рендеринга статических файлов: файлы html помещаются вtemplates
В каталоге размещаются css, js и картинкиstatic
в каталоге.
Пожалуйстаздесь репоСм. структуру каталогов простого статического приложения hello world в файлах .
FROM python:3.6
# 创建 app 目录
WORKDIR /app
# 安装 app 依赖
COPY static_app/requirements.txt ./
RUN pip install -r requirements.txt
# 打包 app 源码
COPY static_app /app
EXPOSE 8080
CMD ["python","server.py"]
In your server.py,
if __name__ == '__main__':
app.run(host='0.0.0.0')
Обратите внимание, что хост должен быть установлен на0.0.0.0
- Это позволяет получить доступ к вашему сервису за пределами контейнера. Если этот параметр не установлен, хост по умолчанию будетlocalhost
.
5. Прямая сборка в производстве
FROM python:3.6
# 创建 app 目录
WORKDIR /app
# 安装 app 依赖
COPY gunicorn_app/requirements.txt ./
RUN pip install -r requirements.txt
# 打包 app 源码
COPY . /app
EXPOSE 8080
CMD ["gunicorn", "--config", "./gunicorn_app/conf/gunicorn_config.py", "gunicorn_app:app"]
Создайте и запустите этот универсальный образ:
$ cd python-docker
$ docker build -t python-docker-prod .
$ docker run --rm -it -p 8080:8080 python-docker-prod
Поскольку нижний слой — Debian, образ после сборки занимает около 700 МБ (точное значение зависит от вашего исходного кода). Давайте обсудим, как уменьшить размер этого файла.
6. Многоступенчатая сборка в производстве
При использовании многоуровневой сборки будет использоваться несколько файлов Dockerfile.FROM
оператор, но в конечном итоге будут использоваться только файлы, созданные на последнем этапе. Таким образом, полученный образ будет содержать только те зависимости, которые необходимы рабочему серверу, и в идеале файлы будут очень маленькими.
Этот режим сборки полезен, когда вам нужно использовать зависящие от системы модули или модули, которые необходимо скомпилировать. Напримерpycrypto
иnumpy
Он подходит для этого метода.
# ---- 基础 python 镜像 ----
FROM python:3.6 AS base
# 创建 app 目录
WORKDIR /app
# ---- 依赖 ----
FROM base AS dependencies
COPY gunicorn_app/requirements.txt ./
# 安装 app 依赖
RUN pip install -r requirements.txt
# ---- 复制文件并 build ----
FROM dependencies AS build
WORKDIR /app
COPY . /app
# 在需要时进行 Build 或 Compile
# --- 使用 Alpine 发布 ----
FROM python:3.6-alpine3.7 AS release
# 创建 app 目录
WORKDIR /app
COPY --from=dependencies /app/requirements.txt ./
COPY --from=dependencies /root/.cache /root/.cache
# 安装 app 依赖
RUN pip install -r requirements.txt
COPY --from=build /app/ ./
CMD ["gunicorn", "--config", "./gunicorn_app/conf/gunicorn_config.py", "gunicorn_app:app"]
Используя описанный выше метод, размер файла изображения, созданного с помощью Alpine, составляет около 90 МБ, что в 8 раз меньше, чем раньше. использоватьalpine
Версии для сборки позволяют эффективно уменьшить размер образа.
Уведомление:Вышеупомянутые Dockerfiles предназначены дляpython 3
написано, вы можете изменить его наpython 2
Версия. Если вы развертываетеdjango
Приложения также должны иметь возможность создавать готовые к работе файлы Dockerfile с некоторыми изменениями.
Если у вас есть какие-либо предложения по предыдущему подходу или вы хотели бы увидеть другие варианты использования, сообщите об этом автору.
Добро пожаловатьRedditилиHackerNewsПрисоединяйтесь к обсуждению :)
Кроме того, вы пытались развернуть веб-приложение Python на Hasura? На самом деле это самый быстрый способ развернуть приложение Python в домене HTTPS (просто используйте git push). попробуй использоватьHasselblad.IO/Хубэй/проект…шаблон, чтобы начать быстро! Все шаблоны проектов в Hasura поставляются со стандартными файлами Dockerfiles и Kubernetes, которые вы можете определять свободно.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.