Написание файлов Docker для веб-приложения Python

задняя часть Python Программа перевода самородков Gunicorn
Написание файлов Docker для веб-приложения Python

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.

содержание

  1. Простой Dockerfile с .dockerignore
  2. Горячая перезагрузка с пушечным огнем
  3. Запустите однофайловый скрипт Python
  4. Развертывание статических файлов
  5. Прямая сборка в производстве
  6. Многоэтапные сборки в производстве

Предположим, у нас есть приложение под названием 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,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.